Kotlin中如何将点分隔字符串列表转换为Map<String, List<String>>?
解决方案
Kotlin 标准库提供了专属的分组API groupBy,可以直接实现你要的一对多分组合并效果,代码如下:
val field = listOf("key1.value1", "key1.value2", "key2.value3") val attributes = field.groupBy( keySelector = { it.substringBefore('.') }, valueTransform = { it.substringAfter('.') } )
注:如果你需要和原代码逻辑完全对齐(支持元素包含多个
.的场景,取第一个.前的内容为key,最后一个.后的内容为value),可以将keySelector和valueTransform替换为{ it.split(".").first() }和{ it.split(".").last() }。如果你的业务场景下每个元素仅包含一个.,使用substringBefore/substringAfter性能更高,不需要生成额外的列表对象。
原associateByTo不生效的原因
associateBy/associateByTo的设计定位就是一对一映射,同一个key出现多次时,后面的会直接覆盖前面的,所以天然不适合这种一对多的分组场景。
如果需要可变的Map/List
如果后续需要修改生成的attributes集合,可以使用groupByTo指定可变集合:
val attributes = field.groupByTo( destination = mutableMapOf(), keySelector = { it.substringBefore('.') }, valueTransform = { it.substringAfter('.') } )
内容的提问来源于stack exchange,提问作者Biu
相关产品推荐
相关产品推荐

