如果指定的键不存在,则Java HashMap merge()方法会将指定的键/值映射插入到哈希映射中。
但是,如果指定的键已经与一个值关联,则该方法将旧的值替换为指定函数的结果。
merge()方法的语法为:
hashmap.merge(key, value, remappingFunction)
merge()方法采用3个参数:
key - 要指定与键关联的值
value - 如果key已经与任何值关联,则需要与key关联的值
remappingFunction - 如果键已经与值关联,则结果与键关联。
返回与键(key)关联的新值
如果没有与键(key)关联的值,则返回null
注意:如果remappingFunction结果为null,则将删除指定键的映射。
import java.util.HashMap;
class Main {
public static void main(String[] args) {
//创建 HashMap
HashMap<String, Integer> prices = new HashMap<>();
//向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("衬衫的价格: " + returnedValue);
//打印更新的HashMap
System.out.println("更新后的 HashMap: " + prices);
}
}输出结果
HashMap: {Pant=150, Bag=300, Shoes=200}
衬衫的价格: 100
更新后的 HashMap: {Pant=150, Shirt=100, Bag=300, Shoes=200}在上面的示例中,我们创建了一个名为prices的哈希映射。注意表达式
prices.merge("Shirt", 100, (oldValue, newValue) -> oldValue + newValue)在这里,我们使用了lambda表达式 (oldValue, newValue) -> oldValue + newValue) 作为remappingFunction函数。要了解有关lambda表达式的更多信息,请访问Java Lambda 表达式。
由于键Shirt在prices中不存在,因此merge()方法将Shirt=100插入映射。并且,remappingFunction的结果将被忽略。
import java.util.HashMap;
class Main {
public static void main(String[] args) {
// 创建 HashMap
HashMap<String, String> countries = new HashMap<>();
// 向HashMap插入条目
countries.put("Washington", "America");
countries.put("Canberra", "Australia");
countries.put("Madrid", "Spain");
System.out.println("HashMap: " + countries);
// Washington 键的合并映射
String returnedValue = countries.merge("Washington", "USA", (oldValue, newValue) -> oldValue + "/" + newValue);
System.out.println("Washington: " + returnedValue);
// 打印更新的HashMap
System.out.println("更新后的 HashMap: " + countries);
}
}输出结果
HashMap: {Madrid=Spain, Canberra=Australia, Washington=America}
Washington: America/USA
更新后的 HashMap: {Madrid=Spain, Canberra=Australia, Washington=America/USA},在上面的示例中,我们创建了一个名为countries的哈希映射。注意表达式
countries.merge("Washington", "USA", (oldValue, newValue) -> oldValue + "/" + newValue)在这里,我们使用了lambda表达式(oldValue, newValue) -> oldValue + "/" + newValue) 作为 remappingFunction。
由于键Washington已经存在countries中,所以旧值将由remappingFunction返回的值替换。因此,Washington 的映射包括值 America/USA。
import java.util.HashMap;
class Main {
public static void main(String[] args) {
//创建 HashMap
HashMap<String, Integer> prices1 = new HashMap<>();
//向HashMap插入条目
prices1.put("Pant", 230);
prices1.put("Shoes", 350);
System.out.println("HashMap 1: " + prices1);
//创建另一个hashmap
HashMap<String, Integer> prices2 = new HashMap<>();
//向HashMap插入条目
prices2.put("Shirt", 150);
prices2.put("Shoes", 320);
System.out.println("HashMap 2: " + prices2);
// forEach()访问prices2的每个条目
// merge()将每个条目从prices2插入到prices1
prices2.forEach((key, value) -> prices1.merge(key, value, (oldValue, newValue) -> {
//返回较小的值
if (oldValue < newValue) {
return oldValue;
}
else {
return newValue;
}
}));
System.out.println("合并后的 HashMap: " + prices1);
}
}输出结果
HashMap 1: {Pant=230, Shoes=350}
HashMap 2: {Shirt=150, Shoes=320}
合并后的 HashMap: {Pant=230, Shirt=150, Shoes=320}在上面的示例中,我们创建了两个名为prices1和prices2的哈希映射。注意代码,
prices2.forEach((key, value) -> prices1.merge(key, value, (oldValue, newValue) -> {
if (oldValue < newValue) {
return oldValue;
}
else {
return newValue;
}
}));在这里,HashMap forEach()方法访问哈希表prices2的每个条目,并将其合并到哈希表prices1中。 我们使用了两个lambda表达式:
(key, value) -> prices.merge(...) - 它访问prices1的每个条目,并将其传递给merge()方法。
(oldValue, newValue) -> {...} - 这是一个重新映射函数(remappingFunction)。它比较两个值并返回较小的值。
由于键Shoes在两个哈希映射中都存在,因此Shoes的值被重新映射函数(remappingFunction)的结果替换。
我们还可以使用putAll()方法合并两个哈希映射。 但是,如果两个哈希映射中都存在键,则旧值将被新值替换
与merge()不同,putAll()方法不提供重新映射功能。 因此,我们无法确定要为重复键存储的值。
要了解有关该putAll()方法的更多信息,请访问Java HashMap putAll()。