【睡JDK】Java函數式編程接口詳解之Supplier

一、Supplier簡介

Supplier有什麼好處?這個在網上也是衆說紛紜,Supplier可能不像之前介紹的PredicateConsumer、Function那麼好理解。官方的介紹是:

表示結果的提供者,不要求每次調用Supplier時都返回新的或不同的結果。

源碼如下:

@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

我們可以用Supplier來表示如何獲取一個結果,在需要這個結果時調用get()函數,即可拿到這個結果。舉個簡單的例子:

Suppliper<Person> supplier = Person::new;
Person p = supplier.get();

上面的例子描述瞭如何獲取一個Person對象,是的,很簡單的一個例子,這也導致了很多人覺得Supplier沒有存在的必要,確實,如果僅僅只是new一個簡單的對象,使用Supplier確實有點小題大作。

你必須要明白的是,使用Supplier是幫助你獲得一個結果,這個結果可以是一個對象,也可以是某一個固定的值。在你發現需要一系列繁瑣的操作才能獲取到一個結果時,就可以考慮使用Supplier來表示如何獲取這個結果。

這裏需要注意的是不要和Consumer、Function弄混了。首先Supplier的get()函數無參,目標是獲取結果,而Consumer、Function都需要傳入一個參數,Consumer注重的是處理的過程,Function注重的是過程及結果。

二、實現類SingletonSupplier

如果僅僅使用Supplier接口,很多時候可能很難滿足業務需求,需要去實現Supplier接口。舉個Spring的例子SingletonSupplier,使用它,我們很容易維護一個單例。

具體源代碼就不說了,我們就看看如何通過SingletonSupplier實現一個單例:

public class Person {
    private static SingletonSupplier<Person> holder = new SingletonSupplier<>(null, Person::new);

    private Person() {}

    public static Person getInstance() {
        return holder.get();
    }
}

實現過程是不是很簡單呢?而且這還是一個懶漢式的單例,只有在使用的時候纔會新建實例。

三、Supplier的其他變體

接口名 參數 返回類型 描述
BooleanSupplier boolean 結果爲Boolean類型
DoubleSupplier boolean 結果爲Double類型
IntSupplier boolean 結果爲int類型
LongSupplier boolean 結果爲Long類型

文章推薦:

【睡JDK】Java函數式編程接口詳解之Predicate

【睡JDK】Java函數式編程接口詳解之Consumer、Function

【睡JDK】Java函數式編程接口詳解之UnaryOperator、BinaryOperator
end
Java開發樂園

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章