Java 8為Map新增的方法

2020-07-16 10:05:18
Java 8 除了為 Map 增加了 remove(Object key, Object value) 預設方法之外,還增加了如下方法。
名稱 說明
Object compute(Object key, BiFunction remappingFunction) 該方法使用 remappingFunction 根據原 key-value 對計算一個新 value。只要新 value 不為 null,就使用新 value 覆蓋原 value;如果原 value 不為 null,但新 value 為 null,則刪除原 key-value 對;如果原 value、新 value 同時為 null,那麼該方法不改變任何 key-value 對,直接返回 null。
Object computeIfAbsent(Object key, Function mappingFunction) 如果傳給該方法的 key 引數在 Map 中對應的 value 為 null,則使用 mappingFunction 根據 key 計算一個新的結果,如果計算結果不為 null,則用計算結果覆蓋原有的 value。如果原 Map 原來不包括該 key,那麼該方法可能會新增一組 key-value 對。
Object computeIfPresent(Object key, BiFunction remappingFunction) 如果傳給該方法的 key 引數在 Map 中對應的 value 不為 null,該方法將使用 remappingFunction 根據原 key、value 計算一個新的結果,如果計算結果不為 null,則使用該結果覆蓋原來的 value;如果計算結果為 null,則刪除原 key-value 對。
void forEach(BiConsumer action) 該方法是 Java 8 為 Map 新增的一個遍歷 key-value 對的方法,通過該方法可以更簡潔地遍歷 Map 的 key-value 對。
Object getOrDefault(Object key, V defaultValue) 獲取指定 key 對應的 value。如果該 key 不存在,則返回 defaultValue。
Object merge(Object key, Object value, BiFunction remappingFunction) 該方法會先根據 key 引數獲取該 Map 中對應的 value。如果獲取的 value 為 null,則直接用傳入的 value 覆蓋原有的 value(在這種情況下,可能要新增一組 key-value 對);如果獲取的 value 不為 null,則使用 remappingFunction 函數根據原 value、新 value 計算一個新的結果,並用得到的結果去覆蓋原有的 value。
Object putIfAbsent(Object key, Object value) 該方法會自動檢測指定 key 對應的 value 是否為 null,如果該 key 對應的 value 為 null,該方法將會用新 value 代替原來的 null 值。
Object replace(Object key, Object value) 將 Map 中指定 key 對應的 value 替換成新 value。與傳統 put() 方法不同的是,該方法不可能新增新的 key-value 對。如果嘗試替換的 key 在原 Map 中不存在,該方法不會新增 key-value 對,而是返回 null。
boolean replace(K key, V oldValue, V newValue) 將 Map 中指定 key-value 對的原 value 替換成新 value。如果在 Map 中找到指定的 key-value 對,則執行替換並返回 true,否則返回 false。
replaceAll(BiFunction function) 該方法使用 BiFunction 對原 key-value 對執行計算,並將計算結果作為該 key-value 對的 value 值。

下面程式示範了 Map 常用預設方法的功能和用法。
public class MapTest {
    public static void main(String[] args) {
        Map map = new HashMap();
        // 成對放入多個key-value對
        map.put("Java入門教學", 10);
        map.put("C語言入門教學", 20);
        map.put("Python基礎教學", 30);

        // 嘗試替換key為”Go語言入門教學”的 value,由於原 Map 中沒有對應的 key
        // 因此Map沒有改變,不會新增新的key-value對
        map.replace("Go語言入門教學", 40);
        System.out.println(map);
        // 使用原value與傳入引數計算出來的結果覆蓋原有的value
        map.merge("C語言入門教學", 25, (oldVal, param) -> (Integer) oldVal + (Integer) param);
        System.out.println(map);
        // 當key為"Java"對應的value為null (或不存在)時,使用計算的結果作為新value
        map.computeIfAbsent("Java", (key) -> ((String) key).length());
        System.out.println(map); // map 中新增了 Java=4 這組 key-value 對
        // 當key為"Java"對應的value存在時,使用計算的結果作為新value
        map.computeIfPresent("Java", (key, value) -> (Integer) value * (Integer) value);
        System.out.println(map); // map 中 Java=4 變成 Java=16
    }
}
輸出結果為:

{Java入門教學=10, Python基礎教學=30, C語言入門教學=20}
{Java入門教學=10, Python基礎教學=30, C語言入門教學=45}
{Java=4, Java入門教學=10, Python基礎教學=30, C語言入門教學=45}
{Java=16, Java入門教學=10, Python基礎教學=30, C語言入門教學=45}

上面程式中註釋已經寫得很清楚了,而且給出了每個方法的執行結果,讀者可以結合這些方法的 API 文件來閱讀學習,從而掌握 Map 中預設方法的功能與用法。