1. 程式人生 > >java1.8實戰學習(二)——總結:流處理、行為引數化、並行與共享

java1.8實戰學習(二)——總結:流處理、行為引數化、並行與共享

上一篇: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的實現,否則這些實體類在重新編譯時都會失敗。