Java 8预计将在2013 年发布,Java 8将支持Lambda功能,尽管该规范还在不断的变化,但是Java 8的开发版已经实现了对Lambda的支持。
关于 Lambda 表达式的定义请看维基百科。
该文章将带你熟悉 Lambda 语法,以及使用集合 API 中的 Lambda 以及相关的语言增强,本文所有的代码都是在 JDK 8 Lambda build b39 编译。
功能接口
只包含一个方法的接口被称为功能接口,Lambda 表达式用用于任何功能接口适用的地方。
java.awt.event.ActionListener 就是一个功能接口,因为它只有一个方法:void actionPerformed(ActionEvent). 在 Java 7 中我们会编写如下代码:
|
而 Java 8 中可以简化为:
button.addActionListener(e -> { ui.dazzle(e.getModifiers()); }); |
编译器知道Lambda 表达式必须符合 void actionPerformed(ActionEvent) 方法的定义。看起来 Lambda 实体返回 void,实际上它可以推断出参数 e 的类型是 java.awt.event.ActionEvent.
函数集合
Java 8 的类库包含一个新的包 java.util.functions ,这个包中有很多新的功能接口,这些接口可与集合 API 一起使用。
java.util.functions.Predicate
使用谓词 (Predicate) 来筛选集合:
|
这里我们有两个新方法:
● Iterable<T> filter(Predicate<? super T>) 用于获取元素满足某个谓词返回 true 的结果
● <A extends Fillable<? super T>> A into(A) 将用返回的结果填充 ArrayList
java.util.functions.Block
我们可使用一个新的迭代器方法来替换 for 循环 void forEach(Block<? super T>):
|
forEach() 方法是 internal iteration 的一个实例:迭代过程在 Iterable 和 Block 内部进行,每次可访问一个元素。
最后的结果就是用更少的代码来处理集合:
|
这样做的优点是:
元素在需要的时候才进行计算
如果我们取一个上千个元素的集合的前三条时,其他元素就不会被映射
鼓励使用方法链
我们无需才存储中间结果来构建新的集合
内部迭代过程因此大多数细节
例如,我们可以通过下面代码来并行 map() 操作
writing myCollection.parallel().map(e ?> e.length()).