Kotlin 中的 flatMap
是一個非常常用的函數,尤其在處理集合(如 List
、Set
等)時。它結合了 map
和 flatten
的功能,常用于將多個集合扁平化為一個單一的集合。
一、flatMap
函數的特點
-
轉換 + 扁平化:
- 對集合中的每個元素進行轉換,返回一個新的集合。
- 將所有轉換后的集合合并成一個單一的扁平集合。
-
函數簽名(以
List
為例):inline fun <T, R> Iterable<T>.flatMap(transform: (T) -> Iterable<R> ): List<R>
-
不會改變原集合結構:
- 原集合的元素順序可能保留(取決于具體實現),但新集合是獨立的。
-
惰性求值(在 Sequence 中):
- 如果使用
Sequence
的flatMap
,它是惰性執行的,適合處理大數據流。
- 如果使用
二、使用場景
場景 | 示例說明 |
---|---|
合并多個子列表 | 將 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
版本時注意性能和懶加載特性。
如需更具體的使用方式或結合你的項目上下文分析,請提供相關代碼片段。