合并两个具有重复键的映射 (Map<String, Map<String, Object>>)
Merge two Maps (Map<String, Map<String, Object>>) with duplicate keys
我有两个来自 guava 的 ImmutableMap,我正在尝试将它们组合到可以有重复键的地方;
Map<String, Map<String, Object>> map1 = new ImmutableMap.Builder<String, Map<String, Object>>()
.put("config", ImmutableMap.of(
"key1", "value1",
"key2", "value2"))
.put("categoryapproval", ImmutableMap.of("reason_code", "listing_quality"))
.build();
Map<String, Map<String, Object>> map2 = new ImmutableMap.Builder<String, Map<String, Object>>()
.put("config", ImmutableMap.of(
"key1", "value3",
"key4", "value4"))
.build();
所以,我不能使用 putAll()
方法,因为它会按预期抛出 DuplicateKeyException。我想要得到的输出是这样的;
"config" --> "key1": {value1, value3},
"key2": {value2},
"key4": {value4}
最后,我也尝试了 MultiValueMap
,但是,MultiValueMap
将值保留为 List
我需要迭代的地方。在 map1
中,我可以通过 map1.get("config").get("key1")
得到 value1
,其中 value1 可以是任何类型的对象。感谢您提供任何帮助。
你可以使用 Guava 的 Multimap
and Java 8's Map.merge(K, V, BiFunction)
:
Map<String, Multimap<String, Object>> merged = new HashMap<>();
BiFunction<Multimap<String, Object>, Multimap<String, Object>, Multimap<String, Object>> remappingFunction = (value1, value2) -> {
Multimap<String, Object> multimap = HashMultimap.<String, Object>create();
multimap.putAll(value1);
multimap.putAll(value2);
return multimap;
};
map1.forEach((key, value) -> merged.merge(key, Multimaps.forMap(value), remappingFunction));
map2.forEach((key, value) -> merged.merge(key, Multimaps.forMap(value), remappingFunction));
merged.get("config").get("key1");
如果您不使用 Java 8,那么您需要以其他方式管理多图合并,但原理是一样的。
我有两个来自 guava 的 ImmutableMap,我正在尝试将它们组合到可以有重复键的地方;
Map<String, Map<String, Object>> map1 = new ImmutableMap.Builder<String, Map<String, Object>>()
.put("config", ImmutableMap.of(
"key1", "value1",
"key2", "value2"))
.put("categoryapproval", ImmutableMap.of("reason_code", "listing_quality"))
.build();
Map<String, Map<String, Object>> map2 = new ImmutableMap.Builder<String, Map<String, Object>>()
.put("config", ImmutableMap.of(
"key1", "value3",
"key4", "value4"))
.build();
所以,我不能使用 putAll()
方法,因为它会按预期抛出 DuplicateKeyException。我想要得到的输出是这样的;
"config" --> "key1": {value1, value3},
"key2": {value2},
"key4": {value4}
最后,我也尝试了 MultiValueMap
,但是,MultiValueMap
将值保留为 List
我需要迭代的地方。在 map1
中,我可以通过 map1.get("config").get("key1")
得到 value1
,其中 value1 可以是任何类型的对象。感谢您提供任何帮助。
你可以使用 Guava 的 Multimap
and Java 8's Map.merge(K, V, BiFunction)
:
Map<String, Multimap<String, Object>> merged = new HashMap<>();
BiFunction<Multimap<String, Object>, Multimap<String, Object>, Multimap<String, Object>> remappingFunction = (value1, value2) -> {
Multimap<String, Object> multimap = HashMultimap.<String, Object>create();
multimap.putAll(value1);
multimap.putAll(value2);
return multimap;
};
map1.forEach((key, value) -> merged.merge(key, Multimaps.forMap(value), remappingFunction));
map2.forEach((key, value) -> merged.merge(key, Multimaps.forMap(value), remappingFunction));
merged.get("config").get("key1");
如果您不使用 Java 8,那么您需要以其他方式管理多图合并,但原理是一样的。