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

Kotlin技术问询:对象列表转集合及路由转映射优化方法

一、Kotlin中基于对象属性值将对象列表转换为Set集合

要基于对象的属性值把对象列表转成Set,核心是先提取目标属性,再利用Set的去重特性完成转换,常见场景有两种:

  • 提取属性值生成Set:如果只需要属性值的集合,直接用map提取属性后调用toSet()即可,Set会自动去除重复的属性值。
    示例代码:

    data class User(val id: Int, val name: String)
    
    val userList = listOf(User(1, "Alice"), User(2, "Bob"), User(3, "Alice"))
    // 提取name属性生成去重的Set
    val nameSet: Set<String> = userList.map { it.name }.toSet()
    
  • 基于属性去重保留对象实例:如果需要保留对象本身,但要基于某个属性去重,先通过distinctBy指定去重属性(返回去重后的List),再转成Set。
    示例代码:

    // 基于id去重,保留User对象的Set
    val uniqueUserSet: Set<User> = userList.distinctBy { it.id }.toSet()
    
二、优化路由列表转映射的实现

原代码手动遍历分组的逻辑可以用Kotlin标准库的groupBy系列函数简化,代码更简洁且可读性更强:

方式1:直接生成只读Map(推荐)

如果不需要修改映射里的集合,直接用groupBy生成Map<String, List<String>>,这是最简洁的实现:

lateinit var routes: List<Pair<String, String>>
val routesMap: Map<String, List<String>> = routes.groupBy(
    keySelector = { it.first },    // 分组的键:Pair的第一个元素
    valueTransform = { it.second } // 分组的值:Pair的第二个元素
)

方式2:生成HashMap+ArrayList(匹配原代码类型)

如果必须和原代码一样使用HashMap和ArrayList(需要后续修改集合),可以用groupByTo指定目标容器,并转换集合类型:

val routesArrayListMap: HashMap<String, ArrayList<String>> = routes.groupByTo(
    destination = HashMap(),
    keySelector = { it.first },
    valueTransform = { it.second }
) { ArrayList(it) } // 将默认的List转为ArrayList

对比原代码,标准库的分组函数封装了手动getOrPut的逻辑,减少样板代码,同时避免手动操作可能出现的错误。

内容的提问来源于stack exchange,提问作者Ishita Garg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 05:27:32