null會(huì)帶來(lái)很多問(wèn)題祖搓,從開(kāi)始有null開(kāi)始有無(wú)數(shù)程序栽在null的手里狱意,null的含義是不清晰的,檢查null在大多數(shù)情況下是不得不做的拯欧,而我們又在很多時(shí)候忘記了對(duì)null做檢查详囤,在我們的產(chǎn)品真正投入使用的時(shí)候,空指針異常出現(xiàn)了镐作,這是一種討厭的情況藏姐。
鑒于此google的guava庫(kù)中提供了Optional接口來(lái)使null快速失敗蚓再,即在可能為null的對(duì)象上做了一層封裝,在使用Optional靜態(tài)方法of時(shí)包各,如果傳入的參數(shù)為null就拋出NullPointerException異常摘仅。
使用Optional<T>除了簡(jiǎn)化粗魯?shù)膇f(null == object)、降低函數(shù)的復(fù)雜度问畅、增加可讀性之外娃属,它是一種傻瓜式的防護(hù),Optional<T>引導(dǎo)編碼人員主動(dòng)的思考引用為null的情況护姆。
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() | 返回包含的內(nèi)容卵皂,則拋出java.lang.IllegalStateException |
T or(T) | 返回包含的內(nèi)容秩铆,如果為空,則返回指定的值 |
T orNull | 返回包含的內(nèi)容灯变,如果為空殴玛,則返回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 |
3.代碼示例
1.基本用法
Optional<Integer> possible = Optional.fromNullable(5);//創(chuàng)建允許null值的Optional
System.out.println(possible.isPresent());
System.out.println(possible.get()); // 5
System.out.println(possible.or(3)); // 5
System.out.println(possible.orNull()); // 5
System.out.println(possible.asSet()); // [5]
2.presentInstances
List<Optional<Integer>> list = new ArrayList<>();
for (int index = 10; index > 0; --index) {
Integer t;
if (0 == index % 2) {
t = index;
} else {
t = null;
}
list.add(Optional.fromNullable(t));
}
Iterable<Integer> it = Optional.presentInstances(list);
it.forEach(System.err::println);
//輸出結(jié)果為:
//10
//8
//6
//4
//2