Kotlin 中的 flatMap
是一个非常常用的函数,尤其在处理集合(如 List
、Set
等)时。它结合了 map
和 flatten
的功能,常用于将多个集合扁平化为一个单一的集合。
一、flatMap
函数的特点
-
转换 + 扁平化:
- 对集合中的每个元素进行转换,返回一个新的集合。
- 将所有转换后的集合合并成一个单一的扁平集合。
-
函数签名 (以
List
为例):kotlininline fun <T, R> Iterable<T>.flatMap( transform: (T) -> Iterable<R> ): List<R>
-
不会改变原集合结构:
- 原集合的元素顺序可能保留(取决于具体实现),但新集合是独立的。
-
惰性求值(在 Sequence 中):
- 如果使用
Sequence
的flatMap
,它是惰性执行的,适合处理大数据流。
- 如果使用
二、使用场景
场景 | 示例说明 |
---|---|
合并多个子列表 | 将 List<List<String>> 转换为 List<String> |
提取嵌套数据结构中的字段 | 比如从 List<User> 提取所有用户的兴趣爱好(每个用户有多个爱好) |
数据清洗与转换 | 在映射的同时展开数据,比如将字符串按空格拆分成单词流 |
配合网络请求或异步操作 | 在协程中对多个异步结果进行合并处理 |
三、示例代码
示例 1:合并多个子列表
kotlin
val lists = listOf(listOf("a", "b"), listOf("c", "d"), listOf("e"))
val result = lists.flatMap { it } // 输出 ["a", "b", "c", "d", "e"]
示例 2:提取嵌套字段
kotlin
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:字符串拆分
kotlin
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
版本时注意性能和懒加载特性。
如需更具体的使用方式或结合你的项目上下文分析,请提供相关代码片段。