Java8新特性第2章(接口默認方法)

在Java中一個接口一旦發佈就已經被定型,除非咱們可以一次性的更新全部該接口的實現,否者在接口的添加新方法將會破壞現有接口的實現。默認方法就是爲了解決這一問題的,這樣接口在發佈以後依然可以繼續演化。java

默認方法就是向接口增長新的行爲。它是一種新的方法:接口方法能夠是抽象的或者是默認的。默認方法擁有默認實現,接口實現類經過繼承獲得該默認實現。默認方法不是抽象的,因此咱們能夠放心的向函數式接口裏增長默認方法,而不用擔憂函數式接口單抽象方法的限制。git

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());
    }
}

和其餘方法同樣,默認方法也能夠被繼承。github

除了上面看到的默認方法,Java8中還容許咱們在接口中定義靜態方法。這使得咱們能夠從接口中直接調用它相關的輔助方法,而不是從其它的輔助類中調用(如Collections)。在作集合中元素比較的時候,咱們通常須要使用靜態輔助方法生成實現Comparator的比較器,在Java8中咱們能夠直接把該靜態方法定義在Comparator接口中:markdown

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 上添個 Star 吧!app

相關文章
相關標籤/搜索