在java中合并具有相同密钥的两个映射

在java中合并具有相同密钥的两个映射,java,Java,我有一张给定的地图,如下所示: Map<Integer, Map<String, Map<String, Object>>> data1; data1 = {'xxx':{'x':{'abc':'xyz'}}}; 如何实现相同的功能?使用嵌套循环,您应该能够执行以下操作 for (Map.Entry entry : data1.entrySet()) { for (Map.Entry entry2 : data2.entrySet()) {

我有一张给定的地图,如下所示:

Map<Integer, Map<String, Map<String, Object>>> data1;
data1 = {'xxx':{'x':{'abc':'xyz'}}};

如何实现相同的功能?

使用嵌套循环,您应该能够执行以下操作

for (Map.Entry entry : data1.entrySet()) {
    for (Map.Entry entry2 : data2.entrySet()) {
        if (entry.getKey().equals(entry2.getKey())) {
            Map<String, Map<String, Object>> value = entry.getValue();
            value.putAll(entry2.getValue());
        }
    }
}

如果只需要合并第一级贴图,请尝试以下操作:

Map<Integer, Map<String, Map<String, Object>>> r =
                Stream.of(data1.entrySet(), data2.entrySet())
                      .flatMap(Collection::stream) // Create stream of all entry 
                      .collect(groupingBy(Entry::getKey, // Group by Entry::getKey which is your Integer
                                          mapping(Entry::getValue,  // Get Value from your entry
                                                  reducing(new HashMap<>(),
                                                           (m1, m2) -> {
                                                               m1.putAll(m2);
                                                               return m1;
                                                           }
                                                  ))));

此代码支持向下合并两个级别

data2.forEach((k, v) -> data1.merge(k, v, (original, newMap) -> {
    newMap.forEach((k1,v1) -> original.merge(k1, v1, (innerMap, newInnerMap) -> {
        newInnerMap.forEach((k2,v2) -> innerMap.put(k2,v2));
        return innerMap;
    }));
    return original;
}));

三级图是否需要合并?该示例中的xxx是整数吗?如果您的设计中有三级图,几乎可以肯定会有问题。OOP不支持这种解决方案…@zlakad为什么不?
for (Map.Entry entry : data2.entrySet()) {
    data1.computeIfPresent(entry.getKey(), (k,v) -> v.putAll(entry.getValue()));
}
Map<Integer, Map<String, Map<String, Object>>> r =
                Stream.of(data1.entrySet(), data2.entrySet())
                      .flatMap(Collection::stream) // Create stream of all entry 
                      .collect(groupingBy(Entry::getKey, // Group by Entry::getKey which is your Integer
                                          mapping(Entry::getValue,  // Get Value from your entry
                                                  reducing(new HashMap<>(),
                                                           (m1, m2) -> {
                                                               m1.putAll(m2);
                                                               return m1;
                                                           }
                                                  ))));
data2.forEach((k, v) -> data1.merge(k, v, (original, newMap) -> {
    newMap.forEach((k1,v1) -> original.merge(k1, v1, (innerMap, newInnerMap) -> {
        newInnerMap.forEach((k2,v2) -> innerMap.put(k2,v2));
        return innerMap;
    }));
    return original;
}));