最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中流式計算flatMap和map的區(qū)別及說明

 更新時間:2026年01月04日 09:15:51   作者:TTc_  
文章主要講解了在Java中使用`Optional`類時,`map`和`flatMap`的區(qū)別,`map`會將返回值包裝成`Optional`,導致嵌套的`Optional`結構,而`flatMap`會自動展平嵌套的`Optional`,最終得到一層`Optional`,因此,當函數(shù)返回`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:函數(shù)返回普通值,包裝成 Optional,會產生嵌套。
  • flatMap:函數(shù)返回 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>

因此,當函數(shù)返回 Optional 時,應使用 flatMap 而不是 map。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 實體類與String相互轉換實現(xiàn)方式

    實體類與String相互轉換實現(xiàn)方式

    文章記錄了將實體類與String相互轉換的方法,此方法適用于多種場景,如配置轉換等,轉換過程包括將實體類轉為String保存至數(shù)據(jù)庫,從數(shù)據(jù)庫取出String再轉為實體類,此經驗僅供參考
    2026-04-04
  • Jmeter使用接口傳遞數(shù)據(jù)過程圖解

    Jmeter使用接口傳遞數(shù)據(jù)過程圖解

    這篇文章主要介紹了Jmeter使用接口傳遞數(shù)據(jù)過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • Spring中的Schedule動態(tài)添加修改定時任務詳解

    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)詳解

    這篇文章主要為大家介紹了ElasticSearch之索引模板滾動索引實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Java并發(fā)之BlockingQueue的使用

    Java并發(fā)之BlockingQueue的使用

    這篇文章主要介紹了Java并發(fā)之BlockingQueue的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Spring Security 最佳實戰(zhàn)指南

    Spring Security 最佳實戰(zhàn)指南

    文章介紹了SpringSecurity框架的核心概念、配置、最佳實踐、安全監(jiān)控、生產環(huán)境配置以及常見安全漏洞與解決方案,通過實際案例,展示了如何在電商平臺和金融系統(tǒng)中應用SpringSecurity,保護數(shù)據(jù)安全,強調安全是一個持續(xù)過程,需要不斷更新和維護,感興趣的朋友一起看看吧
    2026-04-04
  • 詳解Spring AOP自定義可重復注解沒有生效問題

    詳解Spring AOP自定義可重復注解沒有生效問題

    本文主要介紹了Spring AOP自定義可重復注解沒有生效問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • spring boot + quartz集群搭建的完整步驟

    spring boot + quartz集群搭建的完整步驟

    這篇文章主要給大家介紹了關于spring boot + quartz集群搭建的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-05-05
  • Spring Boot循環(huán)依賴的癥狀和解決方案

    Spring Boot循環(huán)依賴的癥狀和解決方案

    循環(huán)依賴是指在Spring Boot 應用程序中,兩個或多個類之間存在彼此依賴的情況,形成一個循環(huán)依賴鏈。這篇文章主要介紹了SpringBoot循環(huán)依賴的癥狀和解決方法
    2023-04-04
  • 詳解Java多線程編程中線程的啟動、中斷或終止操作

    詳解Java多線程編程中線程的啟動、中斷或終止操作

    在Java中start和tun方法可用被用來啟動線程,而用interrupt方法來中斷或終止線程,以下我們就來詳解Java多線程編程中線程的啟動、中斷或終止操作
    2016-07-07

最新評論

牟定县| 重庆市| 佛山市| 扎赉特旗| 无极县| 定安县| 周口市| 乐清市| 尉犁县| 原平市| 迁安市| 怀柔区| 安溪县| 苍山县| 饶阳县| 新邵县| 怀远县| 怀宁县| 十堰市| 开化县| 大荔县| 四子王旗| 临澧县| 麻栗坡县| 禹州市| 板桥市| 上杭县| 宁德市| 商河县| 绥滨县| 鄂托克旗| 富阳市| 闽清县| 黑龙江省| 滨海县| 南阳市| 乌拉特中旗| 商都县| 拉萨市| 铁岭市| 南丰县|