If the specified key is already associated with a value, the method replaces the old value with the result of the specified function.
The syntax of the merge()
method is:
hashmap.merge(key, value, remappingFunction)
Here, hashmap is an object of the HashMap
class.
merge() Parameters
The merge()
method takes 3 parameters:
- key - key with which the specified value is to be associated
- value - value to be associated with key, if key is already associated with any value
- remappingFunction - result to be associated with key if key is already associated with a value
merge() Return Value
- returns the new value associated with the key
- returns
null
if no value associated with key
Note: If remappingFunction results null
, then the mapping for the specified key is removed.
Example 1: HashMap merge() to Insert New Entry
import java.util.HashMap;
class Main {
public static void main(String[] args) {
// create an HashMap
HashMap<String, Integer> prices = new HashMap<>();
// insert entries to the HashMap
prices.put("Shoes", 200);
prices.put("Bag", 300);
prices.put("Pant", 150);
System.out.println("HashMap: " + prices);
int returnedValue = prices.merge("Shirt", 100, (oldValue, newValue) -> oldValue + newValue);
System.out.println("Price of Shirt: " + returnedValue);
// print updated HashMap
System.out.println("Updated HashMap: " + prices);
}
}
Output
HashMap: {Pant=150, Bag=300, Shoes=200} Price of Shirt: 100 Updated HashMap: {Pant=150, Shirt=100, Bag=300, Shoes=200}
In the above example, we have created a hashmap named prices. Notice the expression,
prices.merge("Shirt", 100, (oldValue, newValue) -> oldValue + newValue)
Here, we have used the lambda expression, (oldValue, newValue) -> oldValue + newValue)
as the remapping function. To learn more about lambda expression, visit Java Lambda Expressions.
Since the key Shirt is not present in prices, the merge()
method inserts the mapping Shirt=100
. And, the result from remapping function is ignored.
Example 2: HashMap merge() to Insert Entry with Duplicate Key
import java.util.HashMap;
class Main {
public static void main(String[] args) {
// create an HashMap
HashMap<String, String> countries = new HashMap<>();
// insert entries to the HashMap
countries.put("Washington", "America");
countries.put("Canberra", "Australia");
countries.put("Madrid", "Spain");
System.out.println("HashMap: " + countries);
// merge mapping for key Washington
String returnedValue = countries.merge("Washington", "USA", (oldValue, newValue) -> oldValue + "/" + newValue);
System.out.println("Washington: " + returnedValue);
// print updated HashMap
System.out.println("Updated HashMap: " + countries);
}
}
Output
HashMap: {Madrid=Spain, Canberra=Australia, Washington=America} Washington: America/USA Updated HashMap: {Madrid=Spain, Canberra=Australia, Washington=America/USA},
In the above example, we have created a hashmap named countries. Notice the expression,
countries.merge("Washington", "USA", (oldValue, newValue) -> oldValue + "/" + newValue)
Here, we have used the lambda expression, (oldValue, newValue) -> oldValue + "/" + newValue)
as the remapping function.
Since key Washington is already present in countries, the old value is replaced by the value returned by remapping function. Hence, the mapping for Washington includes value America/USA.
Example 3: HashMap merge() to Merge two HashMaps
import java.util.HashMap;
class Main {
public static void main(String[] args) {
// create an HashMap
HashMap<String, Integer> prices1 = new HashMap<>();
// insert entries to the HashMap
prices1.put("Pant", 230);
prices1.put("Shoes", 350);
System.out.println("HashMap 1: " + prices1);
// create another hashmap
HashMap<String, Integer> prices2 = new HashMap<>();
//insert entries to the HashMap
prices2.put("Shirt", 150);
prices2.put("Shoes", 320);
System.out.println("HashMap 2: " + prices2);
// forEach() access each entries of prices2
// merge() inserts each entry from prices2 to prices1
prices2.forEach((key, value) -> prices1.merge(key, value, (oldValue, newValue) -> {
// return the smaller value
if (oldValue < newValue) {
return oldValue;
}
else {
return newValue;
}
}));
System.out.println("Merged HashMap: " + prices1);
}
}
Output
HashMap 1: {Pant=230, Shoes=350} HashMap 2: {Shirt=150, Shoes=320} Merged HashMap: {Pant=230, Shirt=150, Shoes=320}
In the above example, we have created two hashmaps named prices1 and prices2. Notice the code,
prices2.forEach((key, value) -> prices1.merge(key, value, (oldValue, newValue) -> {
if (oldValue < newValue) {
return oldValue;
}
else {
return newValue;
}
}));
Here, the HashMap forEach() method accesses each entry of the hashmap prices2 and merges it to the hashmap prices1. We have used two lambda expressions:
- (key, value) -> prices.merge(...) - It accesses each entry of prices1 and passes it to the
merge()
method. - (oldValue, newValue) -> {...} - It is a remapping function. It compares two values and returns the smaller value.
Since the key Shoes is present in both the hashmap, the value of Shoes is replaced by the result of the remapping function.
Java HashMap merge() Vs. putAll
We can also use the putAll()
method to merge two hashmaps. However, if a key is present in both hashmaps, the old value is replaced by the new value.
Unlike the merge()
, the putAll()
method does not provide the remapping function. Hence, we cannot decide what value to store for duplicate keys.
To learn more about the putAll()
method, visit Java HashMap putAll().