如何合并具有相同外层键的嵌套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
相关产品推荐
相关产品推荐

