世界正在缓慢而稳步的改变。这次改变给我们带来了一个新模样的JDK7,java社区也在一直期盼着在JDK8,也许是JDK9中出现一些其他的改进。JDK8的改进目标是填补JDK7实现中的一些空白——部分计划蓝图将被实现,在2013年里,从三个特殊方面提升和优化这门语言:
因此,从明年开始,java会通过在各个平台运行的方式(手机,云端,桌面,服务器等)来作为优化改进的一种方式。接下来,我将把2013年我们所期待的做一个概述——恰好该做新年年度计划——之后,我们将把重点放在提高开发效率的lambda项目上,以及在编写代码中如何将lambda表达式引进。
开发效率
生产效率方面JDK8主要从以下2个目标提升:
-集合(collections)- 通过对集合扩展,让使用时更加简洁
-注解(annotations)- 加强注解支持,允许在上下文中写注解,现在是不能这样用的(如:primitives)
性能
把Fork/Join框架加到JDK7中,是我们转向多核编程的第一步。JDK8通过提供闭包(lambda表达式)支持的方式将这条路线走的更远了。可能影响较大的就是集合部分吧,闭包再加上新的接口和功能将推使java容器到一个新的层次。除了更加增加可读性和代码的简洁性,lambda表达式还使集合操作能充分利用多核处理器特性。
模块化
社区中最让人感兴趣的一块是 jigsaw 项目:这个项目的目的是为JAVA SE平台设计和实现一个标准模块化的系统,然后把这个系统应用到平台本身和JDK。这里我用了过去式的说法是为了那些我们希望摆脱类路径(环境变量)和类载入器,我们不得不把期待留到JAVA9,至于那个时间点,也会因为 jigsaw 项目而被推迟。
我们来看一下2013年java的里程碑:
2013/01/31 M6 功能完成
2013/02/21 M7 开发者预览版本
2013/07/05 M8 最终候选版本
2013/09/09 GA 通用版
除了jigsaw 项目,另外一个让我们兴奋的大变动(在这个版本)将要到来,那就是闭包的支持!在lambda表达式的帮助下,jdk将有了关键性的提升。
Lambdas
首先,我们需要下载个支持lambda的jdk,有两种方式可以获取到:
* 一个用于敢于尝试的人:从sources 源码自己构建
* 快捷版:直接下载编译好的sdk
调整到合适的心态
想要尝试运用最新的特性编写出更加高效和整洁的代码,你必须了解一下几个新的概念--好吧,至少鄙人需要。什么是lambda表达式?
最简单的看待lambda表达式的方式就是,你可以把它看做一个方法:”它提供一系列的正式的参数和一个通过这些参数来表述逻辑的方法体---它可以是一个表达式或者一个代码段。lambda表达式的参数可以是声名的或者引用的,当这些参数是引用类型的时候,那么这些类型就是源于针对lambda表达式的功能性接口。从返回值来看,一个lambda表达式可以是无返回值的--它们不返回任何结果,或者是有返回值的--在表达式里面的某个执行语句返回一个值。
下面是一个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.Comparable java.lang.Runnable java.util.concurrent.Callable java.awt.event.ActionListener
接下来让我们来看看一个线程的启动在future中可能会发生怎么的变化:
旧方式:
new Thread(new Runnable() { @Override public 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相关的功能,但是我还是可以断定:lambdas肯定会给那些Swing开发者带去很多的便利。
动作监听:
JButton button = new JButton("Click"); // NEW WAY: button.addActionListener( (e) -> { System.out.println("The button was clicked!"); }); // OLD WAY: button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("The button was clicked using old fashion code!"); } });
什么是SAM?SAM 是单个抽象方法的替代,因此,直接一点,我们可以说SAM==功能性接口。即使在最初的规范里面,只有一个抽象方法的抽象类被认为是SAM类型的,很多人还是发现/猜出了这样定义的原因。
方法/构造方法 引用
lambdas表达式听起来不错?但是不知为何功能接口带有一定的限制性- 那是否意味着我只能用包含单个抽象方法的接口呢?不见得——JDK8提供了一个别名机制,允许类或者对象的方法“调用”。用一个新增的操作符::可以做到。他可以应用到静态方法或者对象方法的调用。同样也可以应用于构造函数。 本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务