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
相关产品推荐
相关产品推荐

