How to Join or Merge Two Maps in Java

Learn merging two hashmaps in both cases – ignoring duplicate keys (overwrites the value) or handling duplicate keys.

1. Merge Two HashMaps Ignoring Duplicate Keys

This one is a simple solution. Use firstMap.putAll(secondMap) method that copies all of the mappings from the secondMap to firstMap.

As we know hashmap does not allow duplicate keys. So when we merge the maps in this way, for duplicate keys in firstMap the value is overwritten by the value for the same key in secondMap.

Let’s take an example.

//map 1
HashMap<Integer, String> firstMap = new HashMap<>();
firstMap.put(1, "A");
firstMap.put(2, "B");
firstMap.put(3, "C");
firstMap.put(4, "D");

//map 2
HashMap<Integer, String> secondMap = new HashMap<>();
secondMap.put(4, "F"); //It will replace D with F
secondMap.put(5, "G"); //A new pair to be added

//Merge maps
firstMap.putAll(secondMap);

System.out.println(firstMap);

Program output.

{1=A, 2=B, 3=C, 4=F, 5=G}

2. Merge Two Maps with Custom Logic

If we want to handle the cases where duplicate keys are present in the maps and we do not want to lose the data for any map and for any key. In this case, we can take the help of Map.merge() function added in Java 8.

The merge() function takes 3 arguments: key, value and a user-provided BiFunction to merge values for duplicate keys.

In our example, we want to append the values (from both maps) for a duplicate key.

//map 1
HashMap<Integer, String> firstMap = new HashMap<>();
firstMap.put(1, "A");
firstMap.put(2, "B");
firstMap.put(3, "C");
firstMap.put(4, "D");

//map 2
HashMap<Integer, String> secondMap = new HashMap<>();
secondMap.put(4, "F"); //It will replace D with F
secondMap.put(5, "G"); //A new pair to be added

//Merge maps
secondMap.forEach((key, value) -> thirdMap.merge(key, value, String::concat));

System.out.println(firstMap);

Program output.

{1=A, 2=B, 3=C, 4=DF, 5=G}

Notice the value of key "4". It had value D in the first map and F in the second map. In the merged map, it is a combined value as "DF".

We can write any sort of merge logic in provided BiFunction. For example, if we want to append the values and put a delimiter in between then we can write our own BiFunction

secondMap.forEach(
     (key, value) -> thirdMap.merge(key, value, (v1, v2) -> v1.equalsIgnoreCase(v2) ? v1 : v1 + "," + v2)
);

Now the output is a concatenated value and a delimiter in between the values D and F.

{1=A, 2=B, 3=C, 4=D,F, 5=G}

Happy Learning !!

Source Code on Github

Leave a Reply

3 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments

About Us

HowToDoInJava provides tutorials and how-to guides on Java and related technologies.

It also shares the best practices, algorithms & solutions, and frequently asked interview questions.

Our Blogs

REST API Tutorial