java之在 Java 中合并两个 Map 值,如果键相同,则附加在 Java 7 或 Java 8 中不会覆盖的值

dyllove98 阅读:27 2025-01-19 22:14:33 评论:0

我想合并2个Map,但是当key相同时,应该追加而不是覆盖值。

我们说

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

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

但我正在寻找类似的输出

{ABCD=[AB,BC,CD,ED]} 

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

请您参考如下方法:

您可以使用 Stream.concat 连接两个 map ,然后使用 groupingBy map 键和值作为 Set 进行收集。

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()))); 

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

或者

您可以使用 map 的merge功能。这里将 map2 数据合并到 map1

map2.forEach((key, val) -> map1.merge(key, val, (a, b) -> {a.addAll(b); return a;})); 

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


标签:java
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号