JDK1.8新特性(一)

常接触的新特性有以下几种:

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