如何避免代碼中粗魯?shù)膎ull判斷 裕寨,即Option<T>的價(jià)值脾还?
使用Optional<T>除了簡化粗魯?shù)膇f(null == object)、降低函數(shù)的復(fù)雜度启涯、增加可讀性之外猴抹,它是一種傻瓜式的防護(hù)带族,Optional<T>引導(dǎo)編碼人員主動(dòng)的思考引用為
null
的情況。
準(zhǔn)備工作
官方倉庫:https://github.com/google/guava
在線wiki:https://github.com/google/guava/wiki
Optional<T>簡介
com.google.common.base.Optional
允許接受可能為null的T類型的引用
1.Optional<T>
創(chuàng)建實(shí)例
創(chuàng)建實(shí)例 | 描述 |
---|---|
Optional.of(T) |
若引用為null則快速失敗 java.lang.NullPointerException
|
Optional.absent() |
創(chuàng)建引用缺失的Optional實(shí)例 |
Optional.fromNullable(T) |
引用為null則表示缺失 |
2.Optional<T>
查詢引用
常用方法 | 描述 |
---|---|
boolean isPresent() |
包含的引用非null的(引用存在)蟀给,返回true |
T get() |
包含的引用缺失蝙砌,則拋出java.lang.IllegalStateException
|
T or(T) |
包含的引用缺失,返回指定的值 |
T orNull |
包含的引用缺失跋理,返回null |
Set<T> asSet() |
如果引用存在择克,返回只有單一元素的集合;引用缺失前普,返回空集合肚邢。 | |
<V> Optional<V> transform() |
引用存在,則它被轉(zhuǎn)換給定的功能;否則absent()被返回拭卿。 | |
<T> Iterable<T> presentInstances(Iterable<? extends Optional<? extends T>> optionals) |
將參數(shù)optionals中為null的optional剔除骡湖,同時(shí)返回值對(duì)象的Iterable | |
代碼示例
1.基本用法
Optional<Integer> possible = Optional.fromNullable(5); //創(chuàng)建允許null值的Optional
possible.isPresent();
possible.get(); // 5
possible.or(3)); // 5
possible.orNull(); // 5
possible.asSet(); // [5]
2.abstract <V> Optional<V> transform(Function<? super T,V> function)
用法介紹
根據(jù)Optional中的實(shí)例進(jìn)行功能轉(zhuǎn)化,如下例子可以看出:當(dāng)創(chuàng)建的Optional中的reference為100的時(shí)候峻厚,執(zhí)行該段代碼會(huì)進(jìn)入到apply函數(shù)响蕴,根據(jù)reference進(jìn)行功能函數(shù)切換最終返回一個(gè)新的Optional<Boolean>
對(duì)象;當(dāng)reference為null的時(shí)候惠桃,在Optional.fromNullable
創(chuàng)建的時(shí)候直接創(chuàng)建的Optional.<T>absent()
執(zhí)行g(shù)et方法就會(huì)跑出異常java.lang.IllegalStateException: Optional.get() cannot be called on an absent value
Optional<Integer> possible = Optional.fromNullable(100);
Optional<Boolean> t = possible.transform(new Function<Integer, Boolean>() {
public Boolean apply(Integer input) {
return 100 != input ? Boolean.TRUE : Boolean.FALSE;
}
});
t.get(); // false
3.static <T> Iterable<T> presentInstances(Iterable<? extends Optional<? extends T>> optionals)
如果實(shí)例存在换途,則它被轉(zhuǎn)換給定的功能;否則absent()被返回。
List<Optional<Integer>> list = new ArrayList<Optional<Integer>>();
for (int index = 10; index > 0; --index) {
Integer t;
if (0 == index % 2) {
t = index;
} else {
t = null;
}
list.add(Optional.<Integer>fromNullable(t));
}
Iterable<Integer> it = Optional.presentInstances(list);
it.forEach(new Consumer<Integer>() {
public void accept(Integer integer) {
System.err.println(integer);
}
});
//輸出結(jié)果
//10
//8
//6
//4
//2