jdk13快来了,jdk8的这几点应该看看! (2)

在 java 8 之前,接口与其实现类之间的 耦合度 太高了(tightly coupled),当需要为一个接口添加方法时,所有的实现类都必须随之修改。默认方法解决了这个问题,它可以为接口添加新的方法,而不会破坏已有的接口的实现。这在 lambda 表达式作为 java 8 语言的重要特性而出现之际,为升级旧接口且保持向后兼容(backward compatibility)提供了途径。

jdk13快来了,jdk8的这几点应该看看!

这个 forEach 方法是 jdk 1.8 新增的接口默认方法,正是因为有了默认方法的引入,才不会因为 Iterable 接口中添加了 forEach 方法就需要修改所有 Iterable 接口的实现类。

jdk13快来了,jdk8的这几点应该看看!

jdk13快来了,jdk8的这几点应该看看!

方法引用(Method references)

如果一个Lambda表达式仅仅是调用方法的情况,那么就可以用方法引用来完成,这种情况下使用方法引用代码更易读。

方法引用语法:

目标引用放在分隔符::前,方法的名称放在后面。

jdk13快来了,jdk8的这几点应该看看!

names2.forEach(System.out::println);//1 names2.forEach(s->System.out.println(s));//2

第二行代码的lambda表达式仅仅就是调用方法,调用的System.out的println方法,所以可以用方法引用写成System.out::println即可。

方法引用的种类(Kinds of method references)

方法引用有很多种,它们的语法如下:

静态方法引用:ClassName::methodName

实例上的实例方法引用:instanceReference::methodName

父类的实例方法引用:super::methodName

类型上的实例方法引用:ClassName::methodName

备注:String::toString 等价于lambda表达式 (s) -> s.toString()
这里不太容易理解,实例方法要通过对象来调用,方法引用对应Lambda,Lambda的第一个参数会成为调用实例方法的对象。

构造方法引用:Class::new

数组构造方法引用:TypeName[]::new

个人理解:方法引用,说白了,用更好,不用也可以,如果可以尽量用!!!

Stream

jdk13快来了,jdk8的这几点应该看看!

Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。

Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。

Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。

和迭代器又不同的是,Stream 可以并行化操作,迭代器只能命令式地、串行化操作。

对stream的操作分为三类。

创建stream

中间操作(intermediate operations)【没有终止操作是不会执行的】

终止操作(terminal operations):

jdk13快来了,jdk8的这几点应该看看!

中间操作会返回另一个流。可以用链式编程.的形式继续调用。在没有终止操作的时候,中间操作是不会执行的。

终止操作不会返回流了,而是返回结果(比如返回void-仅仅System.out输出,比如返回总数 int,返回一个集合list等等)

例如:

jdk13快来了,jdk8的这几点应该看看!

流的创建

3种方式创建流,普通流调用

通过Stream接口的静态工厂方法

通过Arrays方法

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwjyz.html