Java Map Merge方法

Merge

先鋪下源碼:

Merge意爲合併,這裏主要是針對Map多個key-value對進行處理,如果key存在,則執行value的merge方法,這裏merge方法是自己定義的,如果key不存在,則會根據默認值將key-value對put到Map中。

    default V merge(K key, V value,
            BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
        Objects.requireNonNull(remappingFunction);
        Objects.requireNonNull(value);
        V oldValue = get(key);
        V newValue = (oldValue == null) ? value :
                   remappingFunction.apply(oldValue, value);
        if(newValue == null) {
            remove(key);
        } else {
            put(key, newValue);
        }
        return newValue;
    }

這裏需要注意的是requireNonNull這兩個行,自定義的function和默認的value不能爲null ,下面兩種寫法都會拋出Exception in thread "main" java.lang.NullPointerException異常:

// 函數爲null        
re.merge("key",3,null);
// value爲null
re.merge("key",null,(old,new_)-> old + new_);

 

使用示例:

先構造好Map

        // merge 方法
        Map<String, Integer> re = new HashMap<>();
        // 向Map插入元素
        re.put("A",1);
        re.put("B",2);

最常用的是對key的累加操作,key存在則累加,key不存在則按初始化value put到Map:

        // A 存在 對A的值累加
        re.merge("A", 1,(old, new_)-> old + new_);
        // C 不存在 按默認值1 put C->1
        re.merge("C",1,(old, new_)-> old + new_);
        // C 已存在 按function 此時爲乘法 進行元素merge
        re.merge("C",3,(old, new_)-> old * new_);

結果:  

  

 

Example:

這裏也可以自定義自己的函數,實現value的處理:

re.merge("C",3,(a,b)-> Merge(a,b));
    // 針對merge方法
    public static Integer Merge(Integer value1, Integer value2) {
        return value1 + value2;
    }

 

總結:

-->  只返回舊值 (old, new) -> new

-->  只返回新值(old, new) -> old

-->  合併兩者(old, new) -> Function(old, new)

-->  刪除舊值 (old, new) -> null

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章