当前位置: 首页 > news >正文

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 版本时注意性能和懒加载特性。

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

相关文章:

  • 亚远景-ASPICE认证:如何优化软件开发流程?
  • 极客天成受邀参加2050大会,共赴人工智能科技盛宴
  • IDEA新版本Local Changes
  • Java后端开发day39--方法引用
  • 【学习资源】知识图谱与大语言模型融合
  • 机器学习之五:基于解释的学习
  • Java语言使用GLM-4-Voice的交互示例
  • CSS Transition入门指南
  • 网络通讯【QTcpServer、QTcpSocket、QAbstractSocket】
  • 在 Windows 的终端安装并使用 azd 命令
  • CVE-2025-21756:Linux内核微小漏洞如何引发完整Root提权攻击(含PoC发布)
  • tornado_登录页面(案例)
  • 多地部署Gerrit Replication插件同步异常解决思路及方案(附脚本与CronJob部署)
  • 【大语言模型DeepSeek+ChatGPT+GIS+Python】AI大语言模型驱动的地质灾害全流程智能防治:风险评估、易发性分析与灾后重建多技术融合应用
  • Uniapp:设置TabBar
  • 从 Synchron 会议观察 Lustre/Scade 同步语言的演化 (1994 - 2024)
  • Ubuntu实现远程文件传输
  • Qt/C++开发监控GB28181系统/获取设备信息/设备配置参数/通道信息/设备状态
  • IOS 国际化词条 Python3 脚本
  • Python实例题:ebay在线拍卖数据分析
  • 工业富联一季度净利增长25%,云计算业务营收增长超50%
  • 朝鲜新型驱逐舰“崔贤”号进行多项武器试验
  • 力箭二号火箭成功进行满载起竖试验,计划今年首飞发射轻舟飞船
  • 北京公园使用指南
  • 马上评丨发钱奖励结婚,支持婚育就该系统性发力
  • 民航局:中方航空公司一季度运输国际旅客同比大增34%