天天看點

《Java核心技術 卷Ⅱ 進階特性(原書第10版)》一1.7.4 用f?latMap來建構Optional值的函數

假設你有一個可以産生Optional對象的方法f,并且目标類型T具有一個可以産生Optional

《Java核心技術 卷Ⅱ 進階特性(原書第10版)》一1.7.4 用f?latMap來建構Optional值的函數

對象的方法g。如果它們都是普通的方法,那麼你可以通過調用s.f().g()來将它們組合起來。但是這種組合沒法工作,因為s.f()的類型為Optional,而不是T。是以,需要調用:

如果s.f()的值存在,那麼g就可以應用到它上面。否則,就會傳回一個空Optional

《Java核心技術 卷Ⅱ 進階特性(原書第10版)》一1.7.4 用f?latMap來建構Optional值的函數

很明顯,如果有更多的可以産生Optional值的方法或Lambda表達式,那麼就可以重複此過程。你可以直接将對f?latMap的調用連結起來,進而建構由這些步驟構成的管道,隻有所有步驟都成功時,該管道才會成功。

例如,考慮前一節中安全的inverse方法。假設我們還有一個安全的平方根:

那麼你可以像下面這樣計算倒數的平方根了:

或者,你可以選擇下面的方式:

無論是inverse方法還是squareRoot方法傳回Optional.empty(),整個結果都會為空。

程式清單1-3中的示例程式示範了Optional API的使用方式。

程式清單1-3 optional/OptionalTest.java

java.util.Optional 8

Optional

《Java核心技術 卷Ⅱ 進階特性(原書第10版)》一1.7.4 用f?latMap來建構Optional值的函數

flatMap(Function< super T,Optional

《Java核心技術 卷Ⅱ 進階特性(原書第10版)》一1.7.4 用f?latMap來建構Optional值的函數

> mapper)

産生将mapper應用于目前的Optional值所産生的結果,或者在目前Optional為空時,傳回一個空Optional。