JDK1.8新特性(一)
常接触的新特性有以下几种:
1.Lambda 表达式 − 可以取代大部分的匿名内部类,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构
注意:并不是所有的接口都可以使用Lambada表达式来简化,只有函数式接口。
规定:接口中只能有一个需要被实现的方法,而不是规定接口中只能有一个方法!(PS:因为1.8中多了一个修饰符:default,使得接口中的方法是可以有默认实现的,所以接口可以有多个方法,但只有一个需要被实现,若有其他的必须得有默认实现。)也就是函数式接口。
语法: () -> {},其中 () 用来描述参数列表,{} 用来描述方法体,-> 为 lambda运算符 ,读作(goes to)。
2.函数式接口(Functional Interface)-就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
有一个很重要的注解@FunctionalInterface,修饰函数式接口的,要求接口中的抽象方法只有一个。 这个注解往往会和 lambda 表达式一起出现。
3.默认方法default-被 default 修饰的方法会有默认实现,不是必须被实现的方法,所以不影响 Lambda 表达式的使用。
4.Stream流-将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
+--------------------+ +------+ +------+ +---+ +-------+ | stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect| +--------------------+ +------+ +------+ +---+ +-------+
这个流程对应Java代码:
List<Integer> transactionsIds = widgets.stream() .filter(b -> b.getColor() == RED) .sorted((x,y) -> x.getWeight() - y.getWeight()) .mapToInt(Widget::getWeight) .sum();
5.Optional 类-用来解决空指针异常。
6.方法引用-减少了冗余代码,代码更加简洁
方法引用符号 ::
使用可以有几种情况:
构造器引用:语法为Class<T>::new
静态方法引用:语法为Class::static_method
特定类的任意对象的方法引用:语法为Class::method
特定对象的方法引用:语法为instance::method