kotlin flatMap 變換函數的特點和使用場景

Kotlin 中的 flatMap 是一個非常常用的函數,尤其在處理集合(如 ListSet 等)時。它結合了 mapflatten 的功能,常用于將多個集合扁平化為一個單一的集合。


一、flatMap 函數的特點

  1. 轉換 + 扁平化

    • 對集合中的每個元素進行轉換,返回一個新的集合。
    • 將所有轉換后的集合合并成一個單一的扁平集合。
  2. 函數簽名(以 List 為例):

    inline fun <T, R> Iterable<T>.flatMap(transform: (T) -> Iterable<R>
    ): List<R>
    
  3. 不會改變原集合結構

    • 原集合的元素順序可能保留(取決于具體實現),但新集合是獨立的。
  4. 惰性求值(在 Sequence 中)

    • 如果使用 SequenceflatMap,它是惰性執行的,適合處理大數據流。

二、使用場景

場景示例說明
合并多個子列表List<List<String>> 轉換為 List<String>
提取嵌套數據結構中的字段比如從 List<User> 提取所有用戶的興趣愛好(每個用戶有多個愛好)
數據清洗與轉換在映射的同時展開數據,比如將字符串按空格拆分成單詞流
配合網絡請求或異步操作在協程中對多個異步結果進行合并處理

三、示例代碼

示例 1:合并多個子列表
val lists = listOf(listOf("a", "b"), listOf("c", "d"), listOf("e"))
val result = lists.flatMap { it } // 輸出 ["a", "b", "c", "d", "e"]
示例 2:提取嵌套字段
data class User(val name: String, val hobbies: List<String>)
val users = listOf(User("Alice", listOf("reading", "coding")),User("Bob", listOf("gaming", "music"))
)
val allHobbies = users.flatMap { it.hobbies } // ["reading", "coding", "gaming", "music"]
示例 3:字符串拆分
val sentences = listOf("Hello world", "Kotlin is great")
val words = sentences.flatMap { it.split(" ") } // ["Hello", "world", "Kotlin", "is", "great"]

四、與其他函數對比

函數功能返回類型是否扁平化
map映射每個元素List<R>? 不會
flatMap映射并展開List<R>? 會
flatten直接展開嵌套集合List<R>? 會(不轉換)
flatMapTo / mapTo指定目標集合存儲結果可指定容器? / ?

五、注意事項

  • flatMap 返回的是一個新的不可變集合。
  • 如果需要可變集合,可以手動轉成 toMutableList()
  • 使用 Sequence 版本時注意性能和懶加載特性。

如需更具體的使用方式或結合你的項目上下文分析,請提供相關代碼片段。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79363.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79363.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79363.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java學習之數據結構:二、鏈表

本節介紹鏈表 目錄 1.什么是鏈表 1.1鏈表定義 1.2鏈表分類 2.鏈表實現 2.1創建鏈表 1&#xff09;手動創建 2&#xff09;創建鏈表類進行管理鏈表的相關操作 2.2添加元素 1&#xff09;頭插法 2&#xff09;尾插法 3&#xff09;任意位置插入 2.3刪除 2.4查找 1&…

【計算機網絡-應用層】解析HTTP會話保持:Cookie與Session的原理與實踐

&#x1f4da; 博主的專欄 &#x1f427; Linux | &#x1f5a5;? C | &#x1f4ca; 數據結構 | &#x1f4a1;C 算法 | &#x1f152; C 語言 | &#x1f310; 計算機網絡 上篇文章&#xff1a;實現HTTP服務器 下篇文章&#xff1a;傳輸層協議-UDP 文章摘要&…

[ Qt ] | 第一個Qt程序

1. 創建Qt項目 我們打開Qt Create工具&#xff0c;左上角“文件”&#xff0c;新建文件。 --- --- --- --- 這個是我們的APP“走出國門”的時候&#xff0c;要關注的&#xff0c;這里就不說了。 后面這兩個直接默認&#xff0c;下一步就行~~。 2. 項目默認內容 下面就是Qt C…

影刀RPA中新增自己的自定義指令

入門到實戰明細 1. 影刀RPA自定義指令概述 1.1 定義與作用 影刀RPA的自定義指令是一種強大的功能&#xff0c;旨在提高流程復用率&#xff0c;讓用戶能夠個性化定制指令&#xff0c;實現流程在不同應用之間的相互調用。通過自定義指令&#xff0c;用戶可以將常用的、具有獨立…

LangChain:重構大語言模型應用開發的范式革命

2022年10月22日,Harrison Chase在GitHub上提交了名為LangChain的開源項目的第一個代碼版本。這個看似普通的代碼提交,卻悄然開啟了一場重塑大語言模型(LLM)應用開發范式的技術革命。彼時,距離ChatGPT引爆全球人工智能浪潮尚有一月之遙,但LangChain的誕生已經預示了LLM技術…

區塊鏈+醫療:破解數據共享困局,筑牢隱私安全防線

在醫療健康領域&#xff0c;數據共享與隱私保護一直是一對難以調和的矛盾。一方面&#xff0c;分散在不同機構的醫療數據&#xff08;如電子病歷、檢查報告、用藥記錄&#xff09;阻礙了診療效率和科研進展&#xff1b;另一方面&#xff0c;患者隱私泄露事件頻發&#xff0c;加…

pycharm導入同目錄下文件未標紅但報錯ModuleNotFoundError

此貼僅為記錄debug過程&#xff0c;為防后續再次遇見 問題 問題情境 復現文章模型&#xff0c;pycharm項目初次運行 問題描述 在導入同目錄下其它文件夾中的python文件時&#xff0c;未標紅&#xff0c;但運行時報錯ModuleNotFoundError 報錯信息 未找到該模塊 Traceback …

啟發式算法-蟻群算法

蟻群算法是模擬螞蟻覓食行為的仿生優化算法&#xff0c;原理是信息素的正反饋機制&#xff0c;螞蟻通過釋放信息素來引導同伴找到最短路徑。把問題的元素抽象為多條路徑&#xff0c;每次迭代時為每只螞蟻構建一個解決方案&#xff0c;該解決方案對應一條完整的路徑&#xff0c;…

Redis 腳本:深入理解與實踐指南

Redis 腳本:深入理解與實踐指南 引言 Redis 是一款高性能的鍵值存儲數據庫,廣泛應用于緩存、消息隊列、分布式鎖等領域。腳本在 Redis 中扮演著至關重要的角色,它允許開發者以編程的方式執行復雜的操作,提高數據處理的效率。本文將深入探討 Redis 腳本的概念、應用場景、…

Vue3 Echarts 3D立方體柱狀圖實現教程

文章目錄 前言一、實現原理二、series ——type: "pictorialBar" 簡介2.1 常用屬性 三、代碼實戰3.1 封裝一個echarts通用組件 echarts.vue3.2 實現一個立方體柱狀圖&#xff08;1&#xff09;首先實現一個基礎柱狀圖&#xff08;2&#xff09;添加立方體棱線&#x…

每天一道面試題@第五天

1.包裝類型的緩存機制了解么&#xff1f; 指部分包裝類在創建對象時&#xff0c;會將一定范圍內的對象緩存起來&#xff0c;當再次使用相同值創建對象時&#xff0c;優先從緩存中獲取&#xff0c;而不是重新創建新對象。【提高性能】【節省內存】 列舉幾個常見的包裝類緩存機…

mysql--索引

索引作為一種數據結構&#xff0c;其用途是用于提升檢索數據的效率。 分類 普通索引&#xff08;INDEX&#xff09;&#xff1a;索引列值可重復 唯一索引&#xff08;UNIQUE&#xff09;&#xff1a;索引列值必須唯一&#xff0c;可以為NULL 主鍵索引&#xff08;PRIMARY KEY&a…

王道考研數據結構課后題代碼題(2026版)——排序部分

一、前言 本合集以王道考研《數據結構》輔導書&#xff08;2026版&#xff09;課后習題代碼題部分為參考依據&#xff0c;給出課后習題代碼題的可執行代碼的實現&#xff0c;本合集使用編程語言以C/C語言為主&#xff0c;也不限于使用Python和Java語言&#xff0c;本套合計代碼…

AVFormatContext 再分析零

隨著對于AVFormatContext 各個參數的學習&#xff0c;逐漸可以從 整體架構上 再認識一下 AVFormatContext 了。 還是從解封裝的第一步開始。 int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options); 實際上…

uniapp打包apk詳細教程

目錄 1.打apk包前提條件 2.獲取uni-app標識 3.進入dcloud開發者后臺 4.開始打包 1.打apk包前提條件 1.在HBuilderX.exe軟化中&#xff0c;登錄自己的賬號 2.在dcloud官網&#xff0c;同樣登錄自己的賬號。沒有可以免費注冊。 2.獲取uni-app標識 獲取方法&#xff1a;點…

Vue2 和 Vue3 的核心區別

1. 響應式原理&#xff1a;從「手動擋」到「自動擋」 Vue2&#xff1a; 使用 Object.defineProperty 監聽數據變化&#xff0c;但無法檢測新增屬性和數組索引修改&#xff0c;需要借助 Vue.set。 // Vue2 中修改數組元素不會觸發視圖更新 this.list[0] 新值; // ? 不…

EMMC存儲性能測試方法

記于 2022 年 9 月 15 日 EMMC存儲性能測試方法 - Wesley’s Blog 參考Android-emmc性能測試 | 一葉知秋進行實踐操作 dd 命令 頁面緩存 為了測試 emmc 的真實讀寫性能&#xff0c;我們需要先把頁面緩存給清理&#xff1a; echo 1 > /proc/sys/vm/drop_caches console:…

軟件管理(安裝方式)

1.rpm安裝 1.1.rpm介紹 rpm軟件包名稱: 軟件名稱 版本號(主版本、次版本、修訂號) 操作系統 -----90%的規律 舉例:openssh-6.6.1p1-31.el7.x86_64.rpm 數字是版本號:第一位主版本號,第二位次版本號,帶橫杠的是修訂號, el幾---操作系統的版本。 #用rpm安裝需要考慮如下信…

OnlyOffice Document Server 源碼調試指南-ARM和x86雙模式安裝支持

在ARM64架構下創建的ONLYOFFICE源碼調試容器具有顯著優勢。該容器基于官方Document Server鏡像構建&#xff0c;通過集成Git、Python和Node.js等工具鏈&#xff0c;實現跨平臺環境一致性&#xff0c;確保ARM設備的兼容性。容器化隔離消除了依賴沖突&#xff0c;支持快速部署到邊…

oracle 數據庫查詢指定用戶下每個表占用空間的大小,倒序顯示

oracle 查詢指定用戶下每個表占用空間的大小&#xff0c;倒序顯示 使用場景&#xff1a;數據分析&#xff1b;導出醫院正式庫到開發環境時&#xff0c;查詢出占用表空間高的業務表、導出時排除該表 在Oracle數據庫中&#xff0c;要查詢指定用戶下每個表占用空間的大小并以倒序…