- Java核心技術·卷Ⅱ:高級特性(原書第10版)
- (美)凱S.霍斯特曼
- 504字
- 2020-10-30 18:10:34
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。
- 深入核心的敏捷開發:ThoughtWorks五大關鍵實踐
- Git Version Control Cookbook
- HTML5+CSS3基礎開發教程(第2版)
- 匯編語言程序設計(第2版)
- Apache Mahout Clustering Designs
- Python機器學習算法: 原理、實現與案例
- SQL 經典實例
- Mastering Apache Storm
- Arduino Wearable Projects
- 虛擬現實建模與編程(SketchUp+OSG開發技術)
- Python Django Web從入門到項目實戰(視頻版)
- INSTANT Lift Web Applications How-to
- MATLAB計算機視覺實戰
- 數據庫基礎與應用實驗教程:Visual FoxPro 6.0
- Java面向對象程序設計(第3版)