《Java8函數語言程式設計》讀書筆記---類庫

J_W發表於2018-12-13

基本型別

使用為基本型別定製的IntStream可以提升系統效能。 在java中,int佔4個位元組,Integer佔16個位元組。在一些情況下使用基本型別更加高效,所以java8有一些專門的基本型別操作,例如: mapToInt(),返回IntStream物件。

過載

方法出現過載overload,javac會挑出最具體的那個,否則報錯。

@FunctionalInterface

函式介面上面需要新增次註釋。
複製程式碼

介面中的預設方法,(介面可以有方法的實現)

以下程式碼片段為Iterable介面中的foreach方法:

/**
     * Performs the given action for each element of the {@code Iterable}
     * until all elements have been processed or the action throws an
     * exception.  Unless otherwise specified by the implementing class,
     * actions are performed in the order of iteration (if an iteration order
     * is specified).  Exceptions thrown by the action are relayed to the
     * caller.
     *
     * @implSpec
     * <p>The default implementation behaves as if:
     * <pre>{@code
     *     for (T t : this)
     *         action.accept(t);
     * }</pre>
     *
     * @param action The action to be performed for each element
     * @throws NullPointerException if the specified action is null
     * @since 1.8
     */
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
複製程式碼

在Iterable介面中有一個方法,該方法是default修飾的,成為預設方法。這種方法存在的原因是為了解決不同java版本的相容問題。 java1-7的程式碼,可以直接在jvm8裡面執行,這是java最大的優勢,但是java8加入了一些新的特性,導致相容存在問題,比如: java8中為Collection介面增加了stream方法,導致所有自建的集合類必須實現stream方法。但是在java7中的自建集合類,並沒有實現該方法。這樣舊程式碼在java8中無法編譯通過。

這種相容性問題的解決方案就是預設方法。上面的例子中,把stream方法變為預設方法,如果子類沒有實現此方法,就直接使用介面的預設方法。這樣java7的自建集合就可以在java8中編譯通過。

介面的靜態方法

java8還允許介面有靜態方法,如常用的Stream.of()
複製程式碼

Optional物件

當你不確定返回的物件是否為空時,可以使用Optional物件作為返回值。他表示:null或者物件。
Optional可以避免空值相關的缺陷。
複製程式碼

相關文章