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

Kotlin Map映射转换

Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、mapValues、flatten、flatMap

引言

在之前的主题中,我们学习了如何筛选(filter)排序(sort)集合。然而,处理集合时最重要的任务之一是转换集合中的元素。本主题将教你如何使用 Kotlin 的转换函数将一个集合转换为另一个集合。


映射(Mapping)

map()
  • 用于将集合中的每个元素应用一个转换函数,返回一个新集合

  • 一对一转换:每个原始元素都对应一个转换后的元素。

示例:
val numbers = listOf(1, 2, 3)
println(numbers.map { it * 2 }) // [2, 4, 6]
mapIndexed()
  • map() 类似,但提供元素的 索引 作为额外参数。
val words = listOf("anne", "michael", "caroline")
println(words.mapIndexed { index, value ->if (index % 2 == 0) value.uppercase() else value
}) // [ANNE, michael, CAROLINE]
应用场景
  • 获取每个字符串长度:words.map { it.length }

  • 将字符串转为整数:listOf("1", "2", "3").map { it.toInt() }

  • 首字母大写:words.map { it.capitalize() }

  • 转换 Map 的键或值


可空类型的映射(Mapping with nullables)

如果某些元素无法转换,map() 会返回 null,集合变成 List<T?>。为避免 null,使用:

mapNotNull() / mapIndexedNotNull()
  • 自动过滤掉为 null 的结果,使结果为非空集合(List<T>)。
val numbers = listOf(1, 2, 3, 4, 5)
println(numbers.map { if (it % 2 == 0) it else null }) // [null, 2, null, 4, null]
println(numbers.mapNotNull { if (it % 2 == 0) it else null }) // [2, 4]

映射 Map 类型(Map Mapping)

Kotlin 的 Map 类型可以使用以下两种方法转换:

mapKeys()
  • 转换 Map 的 键
mapValues()
  • 转换 Map 的 值
val map = mapOf(1 to "one", 2 to "two")
println(map.mapKeys { it.key * 2 }) // {2=one, 4=two}
println(map.mapValues { it.value.uppercase() }) // {1=ONE, 2=TWO}

Flatten(扁平化)

flatten()
  • 把嵌套集合(List of Lists)展开成一个单一列表。
val nested = listOf(listOf(1,2), listOf(3,4))
println(nested.flatten()) // [1, 2, 3, 4]
flatMap()
  • map,再 flatten,适用于一对多转换
val nested = listOf(listOf(1,2), listOf(3,4))
println(nested.flatMap { it.map { it * 2 } }) // [2, 4, 6, 8]
  • 也可以用于 List<Map>
val listOfMaps = listOf(mapOf(1 to "one"), mapOf(2 to "two"))
val result = listOfMaps.flatMap { it.entries }.associate { it.toPair() }
println(result) // {1=one, 2=two}

总结(Conclusion)

我们学到了多种转换集合的方式:

功能方法
一对一转换map()
一对一+索引mapIndexed()
过滤 null 结果mapNotNull()
Map 键值转换mapKeys() / mapValues()
多对一flatten()
一对多flatMap()
http://www.lryc.cn/news/588416.html

相关文章:

  • LeetCode 424.替换后的最长重复字符
  • vim扩展
  • 0-1搭建springboot+vue的教务管理系统(核心源码)
  • c++算法一
  • kali安装失败-选择并安装软件包-一步到位
  • 几种上传ipa到app store的工具
  • 深度解读virtio:Linux IO虚拟化核心机制
  • Redis7持久化
  • Gstreamer之”pad-added“事件
  • 并发编程核心概念详解:进程、线程与协程的本质与差异
  • 融合竞争学习与高斯扰动的多目标加权平均算法(MOWAA)求解多无人机协同路径规划(多起点多终点,起始点、无人机数、障碍物可自定义),提供完整MATLAB代码
  • 【抖音滑动验证码风控分析】
  • 【人工智能99问】什么是深度学习?(2/99)
  • RK3568/3588 Android 12 源码默认使用蓝牙mic录音
  • 显示器核心三要素详解:刷新率、分辨率、色深
  • PHP password_get_info() 函数
  • 渗透笔记1-4
  • Java 树形结构、层级结构数据构建
  • 【LeetCode 热题 100】94. 二叉树的中序遍历——DFS
  • 第四章 uniapp实现兼容多端的树状族谱关系图,剩余组件
  • 用基础模型构建应用(第九章)AI Engineering: Building Applications with Foundation Models学习笔记
  • GaussDB in的用法
  • Elasticsearch 9.x 升级变化
  • C++后端面试八股文
  • 【postgresql数据库实现表的树结构查询】
  • 乳化硅油市场报告:深度解析与未来趋势
  • 信息收集的基本流程
  • 非阻塞写入核心:asyncio.StreamWriter 的流量控制与数据推送之道
  • 电流驱动和电压驱动的区别
  • UV vs Pip:Python 包管理的革命性进化