假設你有一個可以産生Optional對象的方法f,并且目标類型T具有一個可以産生Optional
對象的方法g。如果它們都是普通的方法,那麼你可以通過調用s.f().g()來将它們組合起來。但是這種組合沒法工作,因為s.f()的類型為Optional,而不是T。是以,需要調用:
如果s.f()的值存在,那麼g就可以應用到它上面。否則,就會傳回一個空Optional
。
很明顯,如果有更多的可以産生Optional值的方法或Lambda表達式,那麼就可以重複此過程。你可以直接将對f?latMap的調用連結起來,進而建構由這些步驟構成的管道,隻有所有步驟都成功時,該管道才會成功。
例如,考慮前一節中安全的inverse方法。假設我們還有一個安全的平方根:
那麼你可以像下面這樣計算倒數的平方根了:
或者,你可以選擇下面的方式:
無論是inverse方法還是squareRoot方法傳回Optional.empty(),整個結果都會為空。
程式清單1-3中的示例程式示範了Optional API的使用方式。
程式清單1-3 optional/OptionalTest.java
java.util.Optional 8
Optional
flatMap(Function< super T,Optional
> mapper)
産生将mapper應用于目前的Optional值所産生的結果,或者在目前Optional為空時,傳回一個空Optional。