Java中流式計算flatMap和map的區(qū)別及說明
更新時間:2026年01月04日 09:15:51 作者:TTc_
文章主要講解了在Java中使用`Optional`類時,`map`和`flatMap`的區(qū)別,`map`會將返回值包裝成`Optional`,導致嵌套的`Optional`結構,而`flatMap`會自動展平嵌套的`Optional`,最終得到一層`Optional`,因此,當函數返回`Optional`時,應使用`flatMap`而不是`map`
Java流式計算flatMap和map區(qū)別
示例代碼
List<JSONObject> sflbmcResult =
apiService.getListByApi(522, condition).getData();
ls_sflb = Optional.ofNullable(sflbmcResult)
.flatMap(list -> list.stream()
.filter(Objects::nonNull).findFirst())
.map(json -> json.getString("SFLBMC"))
.orElse("");關鍵在于 findFirst() 返回的是 Optional<JSONObject>,而外層是 Optional<List<JSONObject>>。
使用 map 會得到嵌套的 Optional
Optional.ofNullable(sflbmcResult) // Optional<List<JSONObject>>
.map(list -> list.stream().findFirst())
// ? 返回類型:Optional<Optional<JSONObject>>(嵌套的Optional?。?
.map(json -> json.getString("SFLBMC"))
// ? 編譯錯誤!json的類型是Optional<JSONObject>,不是JSONObject使用 flatMap 會自動展平
Optional.ofNullable(sflbmcResult) // Optional<List<JSONObject>>
.flatMap(list -> list.stream().findFirst())
// ? 返回類型:Optional<JSONObject>(自動展平?。?
.map(json -> json.getString("SFLBMC"))
// ? 正常!json的類型是JSONObject原因:flatMap 會“展平”嵌套的 Optional,而 map 不會。
對比示例
// 類型鏈分析
Optional<List<JSONObject>> // 第一層Optional
↓
flatMap(list -> list.stream().findFirst())
// findFirst()返回:Optional<JSONObject>
// flatMap自動展平:Optional<JSONObject> ?
↓
map(json -> json.getString("SFLBMC"))
// json類型:JSONObject ?
// 返回:Optional<String>如果使用 map:
Optional<List<JSONObject>> // 第一層Optional
↓
map(list -> list.stream().findFirst())
// findFirst()返回:Optional<JSONObject>
// map不展平:Optional<Optional<JSONObject>> ?
↓
map(json -> json.getString("SFLBMC"))
// json類型:Optional<JSONObject> ?
// 編譯錯誤!無法調用getString方法結論:
map:函數返回普通值,包裝成 Optional,會產生嵌套。flatMap:函數返回 Optional,會“展平”嵌套,最終得到一層 Optional。
驗證示例
// 類型鏈分析
Optional<List<JSONObject>> // 第一層Optional
↓
flatMap(list -> list.stream().findFirst())
// findFirst()返回:Optional<JSONObject>
// flatMap自動展平:Optional<JSONObject> ?
↓
map(json -> json.getString("SFLBMC"))
// json類型:JSONObject ?
// 返回:Optional<String>因此,當函數返回 Optional 時,應使用 flatMap 而不是 map。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Spring中的Schedule動態(tài)添加修改定時任務詳解
這篇文章主要介紹了Spring中的Schedule動態(tài)添加修改定時任務詳解,可能有人會問,為啥不用Quartz,Quartz自然是非常方便強大的,但不是本篇要講的內容,本篇就偏要使用SpringSchedule來實現(xiàn)動態(tài)的cron表達式任務,需要的朋友可以參考下2023-11-11
ElasticSearch之索引模板滾動索引實現(xiàn)詳解
這篇文章主要為大家介紹了ElasticSearch之索引模板滾動索引實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04

