在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;
}));