You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Kotlin中,将对象List转换为Map的最有效方法是什么?

Kotlin中List转Map的高效实现方式

在Kotlin里,根据列表元素键的唯一性,有两种最高效的转换方式,均基于标准库优化后的函数,时间复杂度为O(n)(仅遍历列表一次):

1. 键唯一的场景:使用associateBy或associate

如果列表中每个元素的键都是唯一的,associateBy是最直接的选择,它可以分别指定键选择器和值选择器:

示例代码:

// 定义数据类
data class User(val id: Int, val name: String)

val userList = listOf(User(1, "Alice"), User(2, "Bob"), User(3, "Charlie"))

// 转换为键是id、值是User对象的Map
val userMap: Map<Int, User> = userList.associateBy { it.id }

// 转换为键是id、值是name字段的Map
val userNameMap: Map<Int, String> = userList.associateBy(keySelector = { it.id }, valueTransform = { it.name })

如果需要更灵活的键值生成逻辑,可以用associate函数直接返回键值对:

val customMap: Map<String, Int> = userList.associate { it.name to it.id }

2. 键重复的场景:使用groupBy或fold

如果列表中存在重复键,associateBy会覆盖重复键的旧值,此时可以用groupBy将相同键的元素聚合为列表:

示例代码:

val duplicateUserList = listOf(User(1, "Alice"), User(1, "Alicia"), User(2, "Bob"))

// 键为id,值为对应User的列表
val groupedUserMap: Map<Int, List<User>> = duplicateUserList.groupBy { it.id }

如果需要对重复键的值做自定义合并(比如拼接字符串、求和等),可以用fold手动处理:

// 将相同id的用户名拼接成字符串
val mergedUserNameMap: Map<Int, String> = duplicateUserList.fold(mutableMapOf()) { acc, user ->
    acc[user.id] = acc.getOrDefault(user.id, "") + ", " + user.name
    acc
}.mapValues { it.value.removePrefix(", ") } // 移除开头多余的逗号

内容的提问来源于stack exchange,提问作者hassan bazai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:05:38