java8 Map新增方法的使用

概述

java8 Map中新增了幾個面向函數式編程的幾個方法
利用java8可以在接口中定義default方法實現

1、compute()

1、使用
Map<Integer, Integer> map = new HashMap<>(16);
map.compute(1, (k, v) -> {
    if (v == null) {
        return 1;
    }
    return ++v;
});

以上方法表示:如果key不存在就設置value爲1;如果存在則value值+1並設置爲value

2、源碼實現
default V compute(K key,
            BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
        Objects.requireNonNull(remappingFunction);
        V oldValue = get(key);
		// 傳入的函數入參是key和舊的value值
        V newValue = remappingFunction.apply(key, oldValue);
        if (newValue == null) {
            // 如果函數返回的新值爲null,將移除key
            if (oldValue != null || containsKey(key)) {
                // something to remove
                remove(key);
                return null;
            } else {
                // nothing to do. Leave things as they were.
                return null;
            }
        } else {
            // add or replace old mapping
            put(key, newValue);
            return newValue;
        }
    }

簡單的來說就是將當前key的,key值和value值作爲你的函數入參,根據個人定義的函數返回新的value值,若新的值爲null則移除當前key,否則替換成新的值,並返回新值

2、computeIfAbsent()

1、使用
	map.computeIfAbsent(2, k -> 2*k);

表示key=2的值不存在,則設置2*k的值,如果key存在則不做任何修改

2、源碼
default V computeIfAbsent(K key,
           Function<? super K, ? extends V> mappingFunction) {
     Objects.requireNonNull(mappingFunction);
     V v;
     if ((v = get(key)) == null) {
         V newValue;
         if ((newValue = mappingFunction.apply(key)) != null) {
             put(key, newValue);
             return newValue;
         }
     }

     return v;
 }

這段代碼看起來就非常簡單 就是如果key存在則返回當前值;如果key不存在,獲取函數返回值,若返回值不爲null,則設置爲當前key的值,否則不做任何操作返回當前key的值

3、computeIfPresent()

從命名上看就知道,當key值存在的時候,則會進行一些操作,直接貼源碼

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

當key存在的時候,將不爲null的新值替換舊值,否則移除key

4、merge()

1、使用
Integer merge = map.merge(1, 2, (old, v) -> old + v);
2、源碼
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;
    }

獲取當前key的值,如果不存在則使用value作爲新的值,否則使用舊值和入參的value作爲函數的參數獲取新的值,並替換當前值

5、接下來簡單介紹一下1.8之後Map添加的default方法

  1. default V replace(K key, V value):key存在且value值不爲null,則替換,並返回舊值
  2. default boolean replace(K key, V oldValue, V newValue):類似於CAS,如果key存在且value值不爲null且value值等於預期的oldValue,則替換,否則返回false
  3. default boolean remove(Object key, Object value):當前key存在且其value值不爲null並且入參value等於其當前值,則移除key 否則返回false
  4. default V putIfAbsent(K key, V value):如其名,key不存在或當前值爲null,則給put,並返回舊值
  5. default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function):根據函數返回值,替換所有key的value值
  6. default void forEach(BiConsumer<? super K, ? super V> action):遍歷
  7. default V getOrDefault(Object key, V defaultValue):key不存在或值爲null,則返回默認值,否則返回當前值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章