如果指定的鍵不存在,則Java HashMap merge()方法會將指定的鍵/值映射插入到哈希映射中。
但是,如果指定的鍵已經(jīng)與一個值關(guān)聯(lián),則該方法將舊的值替換為指定函數(shù)的結(jié)果。
merge()方法的語法為:
hashmap.merge(key, value, remappingFunction)
merge()方法采用3個參數(shù):
key - 要指定與鍵關(guān)聯(lián)的值
value - 如果key已經(jīng)與任何值關(guān)聯(lián),則需要與key關(guān)聯(lián)的值
remappingFunction - 如果鍵已經(jīng)與值關(guān)聯(lián),則結(jié)果與鍵關(guān)聯(lián)。
返回與鍵(key)關(guān)聯(lián)的新值
如果沒有與鍵(key)關(guān)聯(lián)的值,則返回null
注意:如果remappingFunction結(jié)果為null,則將刪除指定鍵的映射。
import java.util.HashMap;
class Main {
public static void main(String[] args) {
//創(chuàng)建 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);
}
}輸出結(jié)果
HashMap: {Pant=150, Bag=300, Shoes=200}
襯衫的價格: 100
更新后的 HashMap: {Pant=150, Shirt=100, Bag=300, Shoes=200}在上面的示例中,我們創(chuàng)建了一個名為prices的哈希映射。注意表達(dá)式
prices.merge("Shirt", 100, (oldValue, newValue) -> oldValue + newValue)在這里,我們使用了lambda表達(dá)式 (oldValue, newValue) -> oldValue + newValue) 作為remappingFunction函數(shù)。要了解有關(guān)lambda表達(dá)式的更多信息,請訪問Java Lambda 表達(dá)式。
由于鍵Shirt在prices中不存在,因此merge()方法將Shirt=100插入映射。并且,remappingFunction的結(jié)果將被忽略。
import java.util.HashMap;
class Main {
public static void main(String[] args) {
// 創(chuàng)建 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);
}
}輸出結(jié)果
HashMap: {Madrid=Spain, Canberra=Australia, Washington=America}
Washington: America/USA
更新后的 HashMap: {Madrid=Spain, Canberra=Australia, Washington=America/USA},在上面的示例中,我們創(chuàng)建了一個名為countries的哈希映射。注意表達(dá)式
countries.merge("Washington", "USA", (oldValue, newValue) -> oldValue + "/" + newValue)在這里,我們使用了lambda表達(dá)式(oldValue, newValue) -> oldValue + "/" + newValue) 作為 remappingFunction。
由于鍵Washington已經(jīng)存在countries中,所以舊值將由remappingFunction返回的值替換。因此,Washington 的映射包括值 America/USA。
import java.util.HashMap;
class Main {
public static void main(String[] args) {
//創(chuàng)建 HashMap
HashMap<String, Integer> prices1 = new HashMap<>();
//向HashMap插入條目
prices1.put("Pant", 230);
prices1.put("Shoes", 350);
System.out.println("HashMap 1: " + prices1);
//創(chuàng)建另一個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);
}
}輸出結(jié)果
HashMap 1: {Pant=230, Shoes=350}
HashMap 2: {Shirt=150, Shoes=320}
合并后的 HashMap: {Pant=230, Shirt=150, Shoes=320}在上面的示例中,我們創(chuàng)建了兩個名為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表達(dá)式:
(key, value) -> prices.merge(...) - 它訪問prices1的每個條目,并將其傳遞給merge()方法。
(oldValue, newValue) -> {...} - 這是一個重新映射函數(shù)(remappingFunction)。它比較兩個值并返回較小的值。
由于鍵Shoes在兩個哈希映射中都存在,因此Shoes的值被重新映射函數(shù)(remappingFunction)的結(jié)果替換。
我們還可以使用putAll()方法合并兩個哈希映射。 但是,如果兩個哈希映射中都存在鍵,則舊值將被新值替換
與merge()不同,putAll()方法不提供重新映射功能。 因此,我們無法確定要為重復(fù)鍵存儲的值。
要了解有關(guān)該putAll()方法的更多信息,請訪問Java HashMap putAll()。