世界正在缓慢但肯定地发生变化。 在进行了更改之后,使Java有了JDK 7的全新外观,Java社区期待JDK 8以及JDK 9附带的其余改进。
JDK 8的目标目的是填补JDK 7实施中的空白-该实施中剩下的部分难题,应该在2013年底之前为广大读者所用,目的是改善和增强JDK 7中的语言。三个特定方向:

  • 生产率
  • 性能
  • 模块化

因此,从明年开始,java将在所有地方(移动,云,桌面,服务器等)运行,但是会以一种改进的方式运行。 在接下来的内容中,我将简短概述一下2013年的期望-紧接新年决议发布-之后,我将主要关注生产率方面,重点是项目lambda以及它的引入将如何影响我们的编码方式。

生产率

在生产力方面,JDK 8的目标是两个主要领域:–集合–通过引入语言的文字扩展与集合进行交互的更便捷的方式–注释–增强了对注释的支持,允许将注释写在当前非法的环境中(例如原语)

性能

向JDK 7添加Fork / Join框架是Java朝多核CPU迈出的第一步。 JDK 8通过为Java提供闭包支持(即lambda表达式),进一步走了这条路。 Java受影响最大的部分可能是Collections部分,闭包与新添加的接口和功能相结合,将Java容器推向了新的高度。 除了编写更具可读性和更短的代码之外,通过向集合提供将在内部执行的lambda表达式,平台可以利用多核处理器。

模块化

社区中最令人感兴趣的作品之一是项目拼图:“此项目的目标是为Java SE平台设计和实现标准模块系统,并将该系统应用于平台本身和JDK。” 我使用过去式,是因为对于那些希望摆脱类路径和类加载器的人来说,我们不得不推迟对Java 9的使用,因为那时候项目Jigsaw也被推迟了 。

要更清晰地了解剩余的Java路线图2013:

  • 2013/01/31 M6功能完成
  • 2013/02/21 M7开发人员预览
  • 2013/07/05 M8最终版本候选
  • 2013/09/09 GA全面上市

除了项目拼图之外,即将出现的另一个重大变化(在此版本中)是对闭包的支持。 通过lambda表达式的帮助,它们将改善JDK的关键点。

Lambdas

入门

首先,首先应该获得启用了lambda的SDK。 在这个方向上,有两种获取方法:

*适用于勇敢者的一种:从源头构建

*方便的一种:下载已经编译的SDK版本

最初,我从源头开始构建它,但是由于时间紧缺以及与环境变量有关的警告过多,我选择了惰性方法并采用了现有的JDK。 另一个重要的工具是用于编写代码的文本编辑器。 直到现在,它还是最先发布了JDK版本,并在一段时间后启用了IDE。 这次有所不同,这可能还归因于openjdk提供的SDK的透明性和广泛可用性。 几天前,JetBrain实现了第一个启用Java 8的IDE。 因此,IntelliJ IDEA 版本 12是第一个提供对JDK 8支持的IDE,此外还有改进之处吗? 因此,出于测试目的,我在Windows 7,x64计算机上将IntelliJ 12 Community Edition与JDK 8 b68一起使用。 对于那些喜欢Netbeans的人,可以下载具有lambda支持的每晚构建。

调整为适当的心态。

在开始使用新提供的功能来编写经过改进和简洁的代码之前,必须先掌握几个新概念,无论如何我还是需要的。

  • 什么是lambda表达式? 查看lambda表达式的最简单方法就像一种方法:“它提供了形式参数的列表,以及根据这些参数表示的主体(表达式或块)。lambda表达式的参数可以声明或推断。 ,当形式参数具有推断的类型时,则这些类型是从lambda表达式所针对的功能接口类型派生的。 从返回值的角度来看,lambda表达式可以是void兼容的-它们不返回任何值或值兼容-如果任何给定的执行路径返回值。
    lambda表达式的示例:

    (a) (int a, int b) -> a + b(b) (int a, int b) -> {if (a > b) {return a;} else if (a == b) {return a * b;} else {return b;}}
  • 什么是功能接口? 功能接口是仅包含一个抽象方法的接口,因此表示单个方法协定。 在某些情况下,单个方法可能具有带有等效替代签名的多个方法,在这种情况下,所有方法都代表一个方法。 除了通过创建和实例化类来创建接口实例的典型方式之外,还可以通过使用lambda表达式,方法或构造函数引用来创建功能接口实例。
    功能接口示例:

    // custom built functional interface
    public interface FuncInterface {public void invoke(String s1, String s2);
    }

    JAVA API的功能接口示例:

    java.lang.Comparablejava.lang.Runnablejava.util.concurrent.Callablejava.awt.event.ActionListener

    因此,让我们看看线程的开始将来可能如何变化:
    旧方法:

    new Thread(new Runnable() {@Overridepublic void run() {for (int i=0; i< 9; i++) {System.out.println(String.format('Message #%d from inside the thread!', i));}}}).start();

    新方法:

    new Thread(() -> {for (int i=0; i< 9; i++) {System.out.println(String.format('Message #%d from inside the thread!', i));}}).start();

    即使我有一段时间没有编写任何与Java Swing,AWT相关的功能,我也不得不承认lambda将为Swing开发人员的Action侦听器添加新鲜的空气:

    JButton button = new JButton('Click');// NEW WAY:button.addActionListener( (e) -> {System.out.println('The button was clicked!');});// OLD WAY:button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println('The button was clicked using old fashion code!');}});
  • 谁/什么是SAM? SAM代表“单一抽象方法”,因此,为了开一些角,我们可以说SAM ==功能接口。 即使在初始规范中,也将仅具有一种抽象方法的抽象类也视为SAM类型,一些人也发现/猜测了原因。
  • 方法/构造函数引用

Lambda听起来很好听吗? 但是以某种方式对功能接口的需求在某种程度上受到了限制–这是否意味着我只能使用包含单个抽象方法的接口? 并非完全如此-JDK 8提供了一种别名机制,该机制允许从类或对象中“提取”方法。 这可以通过使用新添加的::运算符来完成。 它可以应用于类–用于提取静态方法,也可以应用于对象以提取方法。 相同的运算符也可以用于构造函数。

引用:

interface ConstructorReference{T constructor();
}interface  MethodReference {void anotherMethod(String input);
}public class ConstructorClass {String value;public ConstructorClass() {value = 'default';}public static void method(String input) {System.out.println(input);}public void nextMethod(String input) {// operations}public static void main(String... args) {// constructor referenceConstructorReferencereference = ConstructorClass::new;ConstructorClass cc = reference.constructor();// static method referenceMethodReference mr = cc::method;// object method referenceMethodReference mr2 = cc::nextMethod;System.out.println(cc.value);}
}
  • 接口中的默认方法

这意味着从版本8开始,java接口可以包含方法主体,因此简单地说,java将支持多重继承,而不会带来通常的麻烦。 同样,通过提供接口方法的默认实现,可以确保添加新方法不会在实现类中造成混乱。 JDK 8向java.util.Collection或java.util.Iterator之类的接口添加了默认方法,并通过此方法提供了一种机制,可以在实际需要的地方更好地使用lambda。

值得注意的接口添加:

java.util.stream.Streamablejava.util.stream.Stream

改善馆藏的互动

在我看来,lambda项目所带来的所有更改都是对该语言的极大补充,这将使其与当前的标准保持一致,并使它变得更简单,更精简,但这种更改可能会带来最大的生产力影响和最大的挑战。效果肯定是集合框架的改进。 不,没有Collection 2框架,我们现在仍然必须处理类型擦除,但是Java将做出另一个重要的转变:从外部迭代到内部迭代。 这样,它为开发人员提供了一种以优雅的方式筛选和聚合集合的机制,除此之外还可以提高效率。 通过提供将在内部执行的lambda表达式,可以充分利用多核处理器的能力。 让我们考虑以下情形:

一个。 考虑字符串列表,选择所有大写的字符串。 怎么写?
旧方法:

//.....List inputList = new LinkedList<>();List upper = new LinkedList<>();// add elementsfor (String currentValue : inputList) {if (currentValue != null && currentValue.matches("[A-Z0-9]*")) {upper.add(currentValue);}}System.out.println(upper);

//….. 新方法:

//.....inputList.stream().filter(x -> (x != null && x.matches('[A-Z0-9]*'))).into(upper);

b。 考虑您想将所有提取的字符更改为小写。 使用JDK8的方式如下所示:

// .....inputList.stream().filter(x -> (x != null && x.matches("[A-Z0-9]*"))).map(String::toLowerCase).into(upper);

C。 以及如何从所选集合中找出字符数

// .....  int sumX = inputList.stream().filter(x -> (x != null && x.matches("[A-Z0-9]*"))).map(String::length).reduce(0, Integer::sum);

使用的方法:

default Streamstream() // java.util.CollectionStreamfilter(Predicate predicate) // java.util.stream.StreamIntStream map(IntFunction mapper) //java.util.stream.Stream

d。 如果我想从集合中获取每个元素并打印出来该怎么办?

//OLD WAY:
for (String current : list) {System.out.println(current);
}//NEW WAY:list.forEach(x -> System.out.println(x));

除了提到的功能之外,JDK 8还有其他有趣的消息,但是出于简洁的原因,我将在这里停止。 有关它的更多信息,请参见JDK 8 Project lambda网站或JSR 337的网页。

总而言之,Java正在向前发展,我个人喜欢它的发展方向,另一个有趣的方面是库开发人员也开始采用JDK 8的时间点。 那肯定会很有趣。 感谢您的时间和耐心,祝您圣诞快乐。

资源资源

Brian Goetz资源文件夹:
http://cr.openjdk.java.net/~briangoetz/lambda

方法/构造方法参考:
http://doanduyhai.wordpress.com/2012/07/14/java-8-lambda-in-details-part-iii-method-and-constructor-referencing

参考: Java –我们的JCG合作伙伴 Olimpiu Pop在Java Advent Calendar博客上对JDK 8的远见。

翻译自: https://www.javacodegeeks.com/2012/12/java-far-sight-look-at-jdk-8.html

Java –远景JDK 8相关推荐

  1. 下载最新版本Maven 3.3.9 ,检测安装是否成功时发现Java版本JDK却低于1.7时报错

    下线最新版本Maven 3.3.9 ,检测安装是否成功时发现Java版本JDK却低于1.7时报错 cmd: mvn -v Exception in thread "main" ja ...

  2. java的jdk和jre_Java的JDK和JRE

    Java的JDK和JRE 1.计算机交互方式 图形化界面(Graphical User Interface GUI) 命令行方式(Command Line Interface CLI) 2.Java语 ...

  3. Java之JDK和JRE

    Java之JDK和JRE JDK--JavaDevelopment Kit 称为Java开发包或Java开发工具,是Java语言的软件开发工具包,主要用于移动设备.嵌入式设备上的java应用程序. J ...

  4. java jdk 1.8 配置_java_Day01: java的jdk环境变量配置(1.8)

    具体实现步骤: 步骤一: 首先安装jdk1.8 步骤二: 安装完成后开始配置环境变量,找到此电脑--->右键单击属性--->高级系统设置--->环境变量--->新建系统变量-- ...

  5. java安装jdk错误1316 指定的账户已存在

    java安装jdk错误1316 指定的账户已存在 处理步骤: 1.卸载jdk,成功后重启 2.删除注册表中文件夹 (1)\HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft文件夹 ...

  6. java基础JDK的安装和环境变量的配置

    JRE和JDK: JRE是java程序运行时环境,包含JVM(相当于java在不同操作系统上运行时java和操作系统之间的翻译,保证java程序的跨平台)和运行时所需要的核心库.所以我们想要运行一个已 ...

  7. java编译器jdk版本_以编程方式确定Java类的JDK编译版本

    java编译器jdk版本 当需要确定使用哪个JDK版本来编译特定的Java .class文件时, 通常使用的方法是使用javap并在javap输出中查找列出的"主要版本". 我在我 ...

  8. amd cpu不能在cmd环境下运行java代码_如何在Windows10中配置java的JDK环境

    今天给大家分享一下如何配置java的JDK环境.操作步骤如下: 1.下载好 jdk 的安装文件,我下载的是 jdk-10.0.1_windows-x64_bin.exe 这个版本的安装文件: 2.使用 ...

  9. 下载java的jdk

    下载java的jdk 通过官方下载并安装javase-jdk 下载地址 https://www.oracle.com/cn/java/technologies/javase-downloads.htm ...

最新文章

  1. 深入浅出 SpringMVC - 2 提升篇
  2. Erlang基础学习总结2
  3. Using SSL Certificates with HAProxy--reference
  4. 一个redis的连接库的实现
  5. Leetcode 23.移除元素
  6. event类型 php,深入解析PHP的Laravel框架中的event事件操作
  7. Java连接Elasticsearch6.xxx 高级检索篇三
  8. STM32线缆综合测试系统
  9. DBSCAN聚类算法初探(五)
  10. 蓝桥杯-基础练习 十六进制转八进制
  11. 机器学习分支:active learning、incremental learning、online machine learning
  12. Python GUI程序整理
  13. 手机功能测试主要测哪些方面?
  14. CTF MISC(杂项)知识点总结——图片类(一)
  15. 2021-2027全球与中国网眼织物纺织品市场现状及未来发展趋势
  16. 拍案惊奇——软件调试实战训练营
  17. 笔记本合上后再打开电源键常亮,无法唤醒,只能强制开机
  18. Tecohoo VD-206S 全高清视频会议摄像机
  19. VMware虚拟机怎么安装ghost系统
  20. 浅谈SystemInit时钟系统

热门文章

  1. IntelliJ IDEA 2018.2 发布,支持 Java 11
  2. 浅谈MySQL的B树索引与索引优化
  3. Vue.js 定义组件模板的七种方式
  4. sqlserver中常用的几个存储过程
  5. Linux清理磁盘挂载点方法(亲测有效)
  6. excel如何生成mysql的sql语句_excel 批量生成SQL语句
  7. go编译库给c语言函数返回值,go语言 函数return值的几种情况
  8. 旅游系统_数字洛江智慧旅游系统助力提升旅游安全水平
  9. Object.hashCode()与Object.equals()
  10. 转-Kafka【第一篇】Kafka集群搭建