null會帶來不少問題,從開始有null開始有無數程序栽在null的手裏,null的含義是不清晰的,檢查null在大多數狀況下是不得不作的,而咱們又在不少時候忘記了對null作檢查,在咱們的產品真正投入使用的時候,空指針異常出現了,這是一種討厭的狀況。java
鑑於此google的guava庫中提供了Optional接口來使null快速失敗,即在可能爲null的對象上作了一層封裝,在使用Optional靜態方法of時,若是傳入的參數爲null就拋出NullPointerException異常。函數
使用Optional除了簡化粗魯的if(null == object)、下降函數的複雜度、增長可讀性以外,它是一種傻瓜式的防禦,Optional引導編碼人員主動的思考引用爲null的狀況。google
建立實例 | 描述 |
---|---|
Optional.of(T) | 若引用爲null則快速失敗,拋出異常 java.lang.NullPointerException |
Optional.absent() | 建立引用缺失的Optional實例 |
Optional.fromNullable(T) | 引用爲null則表示缺失 |
經常使用方法 | 描述 |
---|---|
boolean isPresent() | 包含的引用非null的(引用存在),返回true |
T get() | 返回包含的內容,則拋出java.lang.IllegalStateException |
T or(T) | 返回包含的內容,若是爲空,則返回指定的值 |
T orNull | 返回包含的內容,若是爲空,則返回null |
Set
|
若是引用存在,返回只有單一元素的集合;若是引用缺失,返回空集合。 |
|
引用存在,則它被轉換給定的功能;不然absent()被返回。 |
|
將參數optionals中爲null的optional剔除,同時返回值對象的Iterable |
Optional<Integer> possible = Optional.fromNullable(5);//建立容許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]
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); //輸出結果爲: //10 //8 //6 //4 //2