轉載請註明出處:www.jianshu.com/p/2b6880cb9…
歡迎大家關注我的知乎專欄:zhuanlan.zhihu.com/baron
在Java中一個介面一旦釋出就已經被定型,除非我們能夠一次性的更新所有該介面的實現,否者在介面的新增新方法將會破壞現有介面的實現。預設方法就是為了解決這一問題的,這樣介面在釋出之後依然能夠繼續演化。
預設方法就是向介面增加新的行為。它是一種新的方法:介面方法可以是抽象的或者是預設的。預設方法擁有預設實現,介面實現類通過繼承得到該預設實現。預設方法不是抽象的,所以我們可以放心的向函式式介面裡增加預設方法,而不用擔心函式式介面單抽象方法的限制。
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}複製程式碼
和其他方法一樣,預設方法也可以被繼承。
除了上面看到的預設方法,Java8中還允許我們在介面中定義靜態方法。這使得我們可以從介面中直接呼叫它相關的輔助方法,而不是從其它的輔助類中呼叫(如Collections)。在做集合中元素比較的時候,我們一般需要使用靜態輔助方法生成實現Comparator的比較器,在Java8中我們可以直接把該靜態方法定義在Comparator介面中:
public static <T, U extends Comparable<? super U>>
Comparator<T> comparing(Function<T, U> keyExtractor) {
return (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}複製程式碼
如果大家喜歡這一系列的文章,歡迎關注我的知乎專欄、GitHub、簡書部落格。
- 知乎專欄:zhuanlan.zhihu.com/baron
- GitHub:github.com/BaronZ88
- 簡書部落格:www.jianshu.com/users/cfdc5…