#Optionalhtml
##Optional簡述java
按照字面意思的理解,應該可選的意思。一開始我還覺得是相似python裏面的默認參數用法呢,結果語義是指某個值可能有也可能沒有(null)。 感受名字取得不是很直觀。。我以爲叫Nullable不是更好?python
python:程序員
def fn(a='default_value'): print(a) pass
##Optional方法api
Optional沒有公開的構造方法,只有靜態工廠方法:app
Optional<String> optional_2 = Optional.of(str); // 若是str == null,拋出錯誤NullPointerException Optional<String> optional = Optional.ofNullable(str); // 若是str == null,返回一個空Optional<String> Optional.<String>empty(); // 返回一個空Optional<String> String s = optional.get(); //獲取被包裝的值 optional.ifPresent((value) -> System.out.println("hello")); // 若是optional的value不是null,則執行函數表達式 optional.orElse("elseValue"); // 若是optional的value爲null,則返回"elseValue" optional.orElseGet(() -> "orElseGet"); // 若是optional的value不是null,則返回函數表達式的執行結果 optional.orElseThrow(RuntimeException::new); // 若是optional的value不是null,則拋出錯誤 optional.filter((value) -> value.length() == 5); // 過濾獲得長度等於5的value optional.map((value) -> { System.out.println("map:" + value); return value; }); optional.flatMap((value) -> { System.out.println("flatMap:" + value); return Optional.ofNullable(value); });
###map 與 flatMap 的區別函數
map(mapper) 與 flatMap(mapper) 功能上基本是同樣的,只是最後的返回值不同。map(mapper)方法裏面的mapper能夠返回任意類型,可是flatMap(mapper)方法裏面的只能返回Optional類型。code
若是mapper返回結果result的不是null,那麼map就會返回一個Optional<Object>,可是 flatMap 不會對result進行任何包裝。一個常見的例子:htm
Optional<String> os; os.map((value)->Optional.of(value)) //返回的類型是Optional<Optional<String>> os.flatMap((value)->Optional.of(value)) //返回的類型是Optional<String>
##Optional的好處對象
顯式的提醒你須要關注null的狀況,對程序員是一種字面上的約束
將平時的一些顯式的防護性檢測給標準化了,並提供一些可串聯操做
解決一下null會致使疑惑的概念,好比Map裏面的key==null的狀況,以及value==null的狀況
##小節 不過Optional一會兒有這麼多方法,Optional的初衷是什麼?並且Optional也是一個對象,因此它自己也有多是null,這可如何是好。
因此,有個觀點認爲,Optional比較適用的地方是做爲返回值,這樣能夠給使用者一個善意的提醒。
##參考