kotlin flatMap 变换函数的特点和使用场景

Kotlin 中的 flatMap 是一个非常常用的函数,尤其在处理集合(如 ListSet 等)时。它结合了 mapflatten 的功能,常用于将多个集合扁平化为一个单一的集合。


一、flatMap 函数的特点

  1. 转换 + 扁平化

    • 对集合中的每个元素进行转换,返回一个新的集合。
    • 将所有转换后的集合合并成一个单一的扁平集合。
  2. 函数签名 (以 List 为例):

    kotlin 复制代码
    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:合并多个子列表
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 版本时注意性能和懒加载特性。

如需更具体的使用方式或结合你的项目上下文分析,请提供相关代码片段。

相关推荐
kruptos3 小时前
分布式系统怎么“选主“?Raft 共识一次讲清
开发语言·分布式·php·共识算法
吴声子夜歌3 小时前
ApacheCommons——commons-cli(命令行参数解析)
java·开发语言·apache
benchmark_cc4 小时前
REST API 和 Python SDK 应该怎么选?量化交易数据接口选型实战
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
王的宝库4 小时前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang
Tairitsu_H4 小时前
[C++] 深入理解红黑树:封装set与map
开发语言·c++·set·map·红黑树·模拟实现
泡海椒4 小时前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp
小智老师PMP4 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
江畔柳前堤6 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
Figo_Cheung6 小时前
Figo基于RNC理论的宇宙演化第七纪元猜想
开发语言·php
泡海椒7 小时前
JQuick-Curl 二次开发:自定义解析器、扩展点开发指南,如何把框架能力真正变成团队资产
java·开发语言·okhttp·maven