Java8新特性盘点
1、Lambda表达式
设计目的:Lambda表达式是为改善匿名类的臃肿而设计,同时带来函数式编程。
使用场景:函数式接口就是只定义一个抽象方法的接口,凡是需要函数式接口的地方,都可以用lambda表达式以内联的形式法提供实现。
结果:有了lambda可以很方便的把函数(代码)当做参数,也就实现了“行为参数化”,可以很好的应对对于行为有变化的需求,有点类似策略模式。
JDK自定了很多函数式接口,大部分情况下无需自定义,拿来使用。比如Predicate、Consumer、Function。
类型推断:Lambda的类型是从使用Lambda的上下文推断出来的,是要入参、返回值符合接口即可。这意味着同样的 Lambda,可以用在不同的函数式接口。
2、方法引用
你为什么应该关心方法引用?方法引用可以被看作仅仅调用特定方法的Lambda的一种快捷写法。它的基本思想是,如果一个Lambda代表的只是“直接调用这个方法”,那最好还是用名称来调用它,而不是去描述如何调用它。事实上,方法引用就是让你根据已有的方法实现来创建Lambda表达式。但是,显式地指明方法的名称,你的代码的可读性会更好。
方法引用主要有三类。
(1) 指向静态方法的方法引用(例如Integer的parseInt方法,写作Integer::parseInt)。
(2) 指 向 任意类型实例方法 的方法引用(例如 String 的 length 方法,写作
String::length)。
(3) 指向现有对象的实例方法的方法引用(假设你有一个局部变量expensiveTransaction
用于存放Transaction类型的对象,它支持实例方法getValue,那么你就可以写expensive
Transaction::getValue)。
3、流
可以看成集合的可以自定义操作的迭代器。这个自定义操作就是一个函数式接口,所以你可以使用lambda。
使用流可以避免使用传统for循环来处理集合,比如在内存中对一个list按照一个维度进行分组,分组内要排序等等。传统的api写出来的代码很臃肿。
4、Optional
可以通过使用这个类“强制”自己处理空指针的情况,进而避免空指针异常,同时代码看起来优雅很多。
5、CompletableFuture
增强了 Future
6、新的日期API
处理时区也变的简单,可惜mybatis等ORM框架尚未支持。