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

将Map列表拆包合并为另一个Map:寻求更优实现方案

优化Map列表合并的简洁写法

嘿,我太懂你不想反复写getOrElse的烦躁了!针对把Map列表拆包合并成单个Map的需求,确实有不少更简洁、贴合Kotlin语言习惯的实现方式,下面给你几个实用方案:

1. 基础合并(后序Map覆盖前序重复Key)

如果你的需求是后面的Map里的Key值覆盖前面的,用fold结合+操作符就能一行搞定:

val mapList: List<Map<String, Any>> = listOf(mapOf("a" to 1), mapOf("b" to 2, "a" to 3))
val mergedMap = mapList.fold(emptyMap()) { acc, currentMap -> acc + currentMap }
// 结果是 {a=3, b=2}

或者用Kotlin 1.3+推出的buildMap,可读性更强:

val mergedMap = buildMap {
    mapList.forEach { putAll(it) }
}

这两种方式都会自动处理Key冲突,完全不用手动写getOrElse判断Key是否存在。

2. 合并重复Key的对应值

如果需要把相同Key的多个值合并(比如拼成列表、累加数值),可以用flatMap+groupBy的组合:

示例1:把相同Key的值合并成列表

val mergedMap = mapList.flatMap { it.entries }
    .groupBy(keySelector = { it.key }, valueTransform = { it.value })
    .mapValues { it.value } // 这里可以对列表做进一步处理,比如joinToString(", ")
// 结果示例:{a=[1,3], b=[2]}

示例2:累加相同Key的数值(假设值是Int类型)

val mergedMap = mapList.flatMap { it.entries }
    .groupBy(keySelector = { it.key }, valueTransform = { it.value as Int })
    .mapValues { it.value.sum() }
// 结果示例:{a=4, b=2}

这些方案都是利用Kotlin标准库的高阶函数,完全避免了重复的getOrElse模板代码,既简洁又符合函数式编程的风格~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:47:40