java8之lambda表達式(接口中的靜態方法)

在Java8中,你能夠爲接口添加靜態方法。從技術角度來講,這是徹底合法的。只是它看起來違反了接口做爲一個抽象定義的理念。java

至今爲止, 咱們常常在相互一塊兒使用的類中使用靜態方法。你能夠在標準庫中找到像Collection/Collections或者Path/Paths這樣成對的接口和類。以Paths類爲例,它只有一些工廠方法。你能夠經過一組字符串來構造一個路徑,例如Paths.get("jdk1.8.0","jre","bin")。在java8中,Path接口中添加了這樣一個方法:工具

public interface Path{
    public static Path get(String first,String... more){
        return FileSystems.getDefault().getPath(first,more);
    }
    ....
}

這樣Paths類就再沒有存在的必要了。spa

當你查看Coolections類時,你會發現兩種方法,一種以下所示:code

public static void shuffle(List<?> list)

這類方法能夠做爲List接口中的一個默認方法:對象

public default void shuffle();

而後你只須要在任何list對象上調用list.shuffle()。接口

可是這樣沒法適用於靜態的工廠方法,由於你沒有可用的對象來調用該方法。所以,java8中引入了靜態接口方法。例如:字符串

public static <T> List<T> nCopies(int n,T o)   //構造含有n個T類型實例的列表

它能夠做爲List接口的一個靜態方法。這樣你就能夠調用List.nCopies(10,"Fred"),而不是Collections.nCopies(10,"Fred"),就可以更清楚地表示返回的結果是一個List對象。get

雖然Java的集合類不太可能像這樣進行重構,可是當你實現本身的庫時,沒必要再爲工具方法提供一個輔助的類了。在Java8中,不少接口中已經添加了靜態方法。
io

相關文章
相關標籤/搜索