Search code examples
javadictionaryjava-8mergemap

merge two Map Values in Java and if key is same append the Values not overwrite in Java 7 or Java 8


I want to merge 2 Maps, but when the key is the same, the values should be appended instead of overwritten.

Let's say

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

So here the key is same.I know putAll will overwrite the values if key is same

But I am looking for an output like

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

If someone can help me to resolve, will be so thankful.


Solution

  • You make use of the merging function provided to Collectors.toMap that specifies what to do with values of duplicate keys with Streams. Demo

    final Map<String, Set<String>> map3 = Stream.concat(map1.entrySet().stream(), map2.entrySet().stream())
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                    (a, b) -> Stream.concat(a.stream(), b.stream()).collect(Collectors.toSet())));
    

    You can apply a similar approach using Map#merge. Demo

    final Map<String, Set<String>> map3 = new HashMap<>(map1);
    map2.forEach((key, val) -> map3.merge(key, val,
            (a, b) -> Stream.concat(a.stream(), b.stream()).collect(Collectors.toSet())));