官术网_书友最值得收藏!

1.7.4 用flatMap來構建Optional值的函數

假設你有一個可以產生Optional<T>對象的方法f,并且目標類型T具有一個可以產生Optional<U>對象的方法g。如果它們都是普通的方法,那么你可以通過調用s.f().g()來將它們組合起來。但是這種組合沒法工作,因為s.f()的類型為Optional<T>,而不是T。因此,需要調用:

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

很明顯,如果有更多的可以產生Optional值的方法或Lambda表達式,那么就可以重復此過程。你可以直接將對flatMap的調用鏈接起來,從而構建由這些步驟構成的管道,只有所有步驟都成功時,該管道才會成功。

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

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

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

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

注意:你已經在Stream接口中看到過flatMap方法(參見1.3節),當時這個方法被用來將可以產生流的兩個方法組合起來,其實現方式是攤平由流構成的流。如果將可選值當作尺寸為0和1的流來解釋,那么Optional.flatMap方法與其操作方式一樣。

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

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

java.util.Optional 8

·<U>Optional<U>flatMap(Function<?super T,Optional<U>>mapper)

產生將mapper應用于當前的Optional值所產生的結果,或者在當前Optional為空時,返回一個空Optional。

主站蜘蛛池模板: 利津县| 长宁区| 宁波市| 邵阳县| 昂仁县| 比如县| 保德县| 乌兰浩特市| 无极县| 彩票| 博野县| 和林格尔县| 微山县| 即墨市| 望奎县| 综艺| 唐山市| 信宜市| 凤阳县| 涿鹿县| 东乡| 获嘉县| 万年县| 黄大仙区| 洱源县| 图片| 大安市| 积石山| 岳池县| 昔阳县| 武城县| 务川| 遂昌县| 筠连县| 佛学| 宝应县| 独山县| 且末县| 南开区| 遂溪县| 苍梧县|