一、Supplier簡介
Supplier有什麼好處?這個在網上也是衆說紛紜,Supplier可能不像之前介紹的Predicate、Consumer、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類型 |
文章推薦: