【Java8】Optional

#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的好處對象

  1. 顯式的提醒你須要關注null的狀況,對程序員是一種字面上的約束

  2. 將平時的一些顯式的防護性檢測給標準化了,並提供一些可串聯操做

  3. 解決一下null會致使疑惑的概念,好比Map裏面的key==null的狀況,以及value==null的狀況

##小節 不過Optional一會兒有這麼多方法,Optional的初衷是什麼?並且Optional也是一個對象,因此它自己也有多是null,這可如何是好。

因此,有個觀點認爲,Optional比較適用的地方是做爲返回值,這樣能夠給使用者一個善意的提醒。

##參考

  1. http://www.javacodegeeks.com/2013/09/deep-dive-into-optional-class-api-in-java-8.html
  2. What's the point of Guava's Optional class
  3. http://www.nurkiewicz.com/2013/08/optional-in-java-8-cheat-sheet.html
相關文章
相關標籤/搜索