如果指定的鍵不存在,則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á)式的更多信息,請?jiān)L問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()方法的更多信息,請?jiān)L問Java HashMap putAll()。