直到现在,本章中的示例都定义了自己的函数式接口,以便清晰的演示lambda表达式和函数式接口背后的基本概念.但是,很多时候,并不需要自己定义函数式接口,因为JDK8中包含了新包,Java.util.function,其中提供了一些预定义的函数式接口,下面的表对他们进行了介绍:
接口
|
用途
|
UnaryOperator<T>
|
对类型为T的对象应用一元运算,并返回结果.结果的类型也是T,他包含的方法叫做apply()
|
BinaryOperator<T>
|
对类型为T的两个对象应用操作,并返回操作.结果的类型也是T,他包含的方法叫做apply()
|
Consumer<T>
|
对类型为T的对象应用操作,他包含的方法叫做accept()
|
Supplier<T>
|
返回类型为T的对象,包含的方法叫做get()
|
Function<T,R>
|
对类型为T的对象应用操作,并返回结果.结果是类型为R的对象,包含的方法叫做apply()
|
Predicate<T>
|
确定类型为T的对象是否满足某种约束,返回一个指示结果的布尔值,包含的方法叫做test()
|
下面的程序演示了Predicate接口的实际应用.该程序将Predicate用作lambda表达式的函数式接口,以确定某个数是否为偶数,Predicate的抽象方法为test(),如下所示:
boolean test(T val)
如果val满足某个约束或条件,test()方法必须返回true,如下代码所示,如果val为偶数,test()将返回true:
public static void main(String args[]) { Predicate<Integer> isEven = (n)->(n % 2) == 0; if(isEven.test(4)) System.out.println("4 is even"); if(!isEven.test(5)) System.out.println("5 is odd"); }
输出如下所示:
4 is even 5 is odd
问:使用lambda表达式可以将一些新的功能融入API库中,可以举个例子说明一下吗?
答:JDK8中新增的Java API库的一处最重要的增强是引入了新的流包 java.util.stream,这个包定义了一些流类,其中最常见的是Stream,因为与java.util.stream相关,所以流是数据的管道.因此,流表示序列对象.另外,流支持多种类型的操作,允许创建管线(pipeline)来执行一系列针对数据的动作.这些动作经常由lambda表达式来表示.例如,使用流API,可以构造在概念上类似于对数据库进行SQL查询的动作序列.而且在很多情况下,这样的动作序列可以并行执行,这样就可以大大提高效率,特别是当涉及大数据集时,简言之,流API以高效且易用的方式为数据的处理提供了一种强大的方式,要指出的最后一点是,虽然流API支持的流有些类似I/O流,但他们仍是有区别的.