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

如何合并具有相同外层键的嵌套MutableMap,保留所有内部键值对且不覆盖数据

合并嵌套MutableMap且不覆盖原有内容的实现方案

刚好碰到过类似的需求,要实现这种保留所有原有键值对,仅新增第二个Map中不存在的内层条目的逻辑,Kotlin里有非常简洁的写法,分两种场景给你参考:

1. 单次合并的直接实现

如果你只是偶尔合并一次,可以直接用forEach结合getOrPut和putIfAbsent来完成:

// 遍历第二个Map的所有外层键值对
mapTwo.forEach { (outerKey, innerMapToAdd) ->
    // 外层键不存在则创建新的空MutableMap,存在则复用已有的
    val targetInnerMap = mapOne.getOrPut(outerKey) { mutableMapOf() }
    // 只向内层Map添加不存在的键值对,完全不覆盖原有内容
    innerMapToAdd.forEach { (innerKey, value) ->
        targetInnerMap.putIfAbsent(innerKey, value)
    }
}

这段代码完全贴合你的需求:

  • 外层Map的键如果已存在,不会被替换,只会操作对应的内层Map
  • 内层Map的原有键值对会被完整保留,只有第二个Map里全新的内层键会被添加进去
  • 运行你的示例代码后,mapOne的DirectoryOne内层会包含三个Feature条目,和你期望的结果完全一致

2. 封装成扩展函数方便复用

考虑到你需要在应用生命周期内动态多次添加功能项,把这个逻辑封装成扩展函数会更方便,后续调用只需要一行代码:

// 给嵌套MutableMap定义扩展函数
fun MutableMap<String, MutableMap<String, String>>.mergeNestedFeatures(other: MutableMap<String, MutableMap<String, String>>) {
    other.forEach { (outerKey, innerFeatures) ->
        val targetInner = this.getOrPut(outerKey) { mutableMapOf() }
        innerFeatures.forEach { (featureKey, featureValue) ->
            targetInner.putIfAbsent(featureKey, featureValue)
        }
    }
}

// 使用的时候直接调用
mapOne.mergeNestedFeatures(mapTwo)

这样每次需要添加新的功能项Map时,直接调用mergeNestedFeatures方法即可,代码更整洁也更易维护。

注意点

如果你的应用是多线程环境下操作这个Map,记得在合并逻辑外层加锁(比如synchronized),避免出现并发修改的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 12:57:38