合并 Java 中的两个映射值,如果键相同,则附加 Java 7 或 Java 8 中未覆盖的值

Arj*_*jun 3 java dictionary java-8 mergemap

我想合并 2Map秒,但是当键相同时,应该附加值而不是覆盖值。

让我们说

Map<String, Set<String>> map1 = new HashMap<>();
Set<String> set1 = new HashSet<>();
set1.add("AB");
set1.add("BC");
map1.put("ABCD",set1);

Map<String, Set<String>> map2 = new HashMap<>();
Set<String> set2 =new HashSet<>();
set2.add("CD");
set2.add("EF");
map2.put("ABCD",set2);

map1.putAll(map2);
Run Code Online (Sandbox Code Playgroud)

所以这里的键是相同的。我知道如果键相同,putAll 将覆盖值

但我正在寻找类似的输出

{ABCD=[AB,BC,CD,ED]}
Run Code Online (Sandbox Code Playgroud)

如果有人能帮我解决,将不胜感激。

Ekl*_*vya 5

您可以使用Stream.concat然后使用groupingBy地图键和值作为集合收集两个地图。

Map<String, Set<String>> res = 
       Stream.concat(map1.entrySet().stream(), map2.entrySet().stream())
             .collect(Collectors.groupingBy(e-> e.getKey(),
                                Collectors.flatMapping(e -> e.getValue().stream(), Collectors.toSet())));
Run Code Online (Sandbox Code Playgroud)

注意:解决方案使用 Java 9+flatMapping

或者

您可以使用merge地图功能。这里合并map2数据到map1

map2.forEach((key, val) -> map1.merge(key, val, (a, b) -> {a.addAll(b); return a;}));
Run Code Online (Sandbox Code Playgroud)

输出: {ABCD=[AB, BC, CD, EF]}