Java 8新特性之Lambda表达式(2)

四.类型推断

首先看一下Java 7中引入的目标类型推断,即菱形操作符。

在Java 7 中变量list使用了菱形操作符,不用明确声明泛型类型,编译器就可以自己推断出来,而Lambda表达式中的类型推断则是对它的扩展,可以省略表达式中的所有参数类型,但程序依然要经过类型检查来保证运行的安全性,因为编译器可以根据Lambda表达式的上下文信息推断出正确的参数类型。
1.Predicate接口
这里写图片描述
从java.util.function包中查看Predicate接口的源码,发现它是只有一个泛型类型的参数,Lambda表达式实现了Predicate接口,因此x被推断为Integer类型,编译器还可以检查Lambda表达式的返回值是不是boolean类型。但是如果去掉泛型Integer,类型推断系统将无法推断出参数类型,会出现编译报错。

2.BinaryOperator接口
这里写图片描述
该接口接受两个参数,返回一个值。

Java 8中引入的流使得程序员可以站在更高的抽象层次上对集合进行操作。
对集合类操作时,或多或少都要使用到for循环或Iterator迭代器。Java 8以前,使用for循环迭代集合时,要写很多模板代码,而且要把整个for循环读完,才能理解代码的含义,若是嵌套循环的话,将会更加复杂;而使用Iterator迭代器,首先要调用iterator方法,产生一个新的Iterator对象来控制整个迭代过程,然后显示调用这个对象的hasNext方法完成迭代,它的本质是一种串行化操作。
这里写图片描述
如果说Iterator迭代器是外部迭代,那么Java 8中的stream()就是内部迭代,返回的是接口Stream。
这里写图片描述
Stream是用函数式编程方式在集合类上进行复杂操作的工具。如果把后面的count(),那么这段代码并没有做什么实际性的工作,filter没有产生新的集合,即使在filter中加入输出的语句,也不会有任何输出的内容,这点可以自己试验一下。
总而言之,使用这种操作的理想方式是,形成一个返回值是Stream的链(没有返回值),最后用一个返回值不是Stream的操作获得想要的结果(有返回值)。这和Java中的建造者模式有异曲同工之妙(最后调用build方法时,对象才被真正创建)。

五.方法引用和构造器引用

1.对象 ::实例方法
对象和方法都可以自定义。
这里写图片描述
2.类::静态方法
下面两个代码是等价的:
这里写图片描述
3.类::实例方法
下面两个代码是等价的:
这里写图片描述
4.构造方法引用
这里写图片描述

六.Interface的变化

Java 8 中允许Interface中的方法可以有方法体,也就是说,接口中的方法不一定全是抽象方法了,还可以是用static,default修饰的方法。
这里写图片描述
另外:Lambda表达式也推动了某些设计模式的变化,如命令者模式,策略模式,观察者模式,模板方法模式,有兴趣的读者可以自行研究。

上一篇:Java 8新特性之Lambda表达式(1)
下一篇:java中的八大排序算法(1)——插入排序

猜你喜欢

转载自blog.csdn.net/lx_Frolf/article/details/81979220