java1.8实战学习(二)——总结:流处理、行为参数化、并行与共享

版权声明:转载请附上博客地址谢谢 https://blog.csdn.net/F_QWERDF/article/details/84827389

上一篇:java1.8实战学习(一)

下一篇:java1.8实战学习(三)

我们继续来看

  • 默认方法

在加入所有这些新玩意儿改进Java 的时候, Java 8 设计者发现的一个现实问题就是现有的接口也在改进。比如,
Collections.sort方法真的应该属于List接口,但却从来没有放在后者里。理想的情况下,你会希望做list.sort(comparator),而不是Collections.sort(list, comparator)。这看起来无关紧要,但是在Java 8之前,你可能会更新一个接口,然后发现你把所有实现它的类

也给更新了——简直是逻辑灾难!这个问题在Java 8里由默认方法解决了。

在上节中,我们给出了下面这段Java 8示例代码:

List<Apple> heavyApples1 = 
 inventory.stream().filter((Apple a) -> a.getWeight() > 150) 
 .collect(toList()); 
List<Apple> heavyApples2 = 
 inventory.parallelStream().filter((Apple a) -> a.getWeight() > 150) 
 .collect(toList()); 

但这里有个问题:在Java 8之前,List<T>并没有stream或parallelStream方法,它实现的Collection<T>接口也没有,因为当初还没有想到这些方法嘛!可没有这些方法,这些代码就不能编译。

Java 8的解决方法就是打破最后一环——接口如今可以包含实现类没有提供实现的方法签名了!那谁来实现它呢?缺失的方法主体随接口提供了(因此就有了默认实现),而不是由实现类提供。
这就给接口设计者提供了一个扩充接口的方式,而不会破坏现有的代码。Java 8在接口声明中使用新的default关键字来表示这一点。

例如,在Java 8里,你现在可以直接对List调用sort方法。它是用Java 8 List接口中如下所示的默认方法实现的,它会调用Collections.sort静态方法:

default void sort(Comparator<? super E> c) { 
 Collections.sort(this, c); 
} 

这意味着List的任何实体类都不需要显式实现sort,而在以前的Java版本中,除非提供了
sort的实现,否则这些实体类在重新编译时都会失败。
 

猜你喜欢

转载自blog.csdn.net/F_QWERDF/article/details/84827389