日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java8 Map新增方法的使用

發布時間:2025/3/12 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java8 Map新增方法的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

文章目錄

      • 文章目錄
  • java8 Map新增方法的使用
    • 概述
        • 1、compute()
          • 1、使用
          • 2、源碼實現
        • 2、computeIfAbsent()
          • 1、使用
          • 2、源碼
        • 3、computeIfPresent()
        • 4、merge()
          • 1、使用
          • 2、源碼
        • 5、接下來簡單介紹一下1.8之后Map添加的default方法
  • map新增的方法:
      • getOrDefault
      • forEach
      • putIfAbsent
      • remove(key,value)
      • replace(K key, V value)
      • replace(K key, V oldValue, V newValue)
      • replaceAll
      • merge
      • compute
      • computeIfAbsent

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,將移除keyif (oldValue != null || containsKey(key)) {// something to removeremove(key);return null;} else {// nothing to do. Leave things as they were.return null;}} else {// add or replace old mappingput(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方法

  • default V replace(K key, V value):key存在且value值不為null,則替換,并返回舊值
  • default boolean replace(K key, V oldValue, V newValue):類似于CAS,如果key存在且value值不為null且value值等于預期的oldValue,則替換,否則返回false
  • default boolean remove(Object key, Object value):當前key存在且其value值不為null并且入參value等于其當前值,則移除key 否則返回false
  • default V putIfAbsent(K key, V value):如其名,key不存在或當前值為null,則給put,并返回舊值
  • default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function):根據函數返回值,替換所有key的value值
  • default void forEach(BiConsumer<? super K, ? super V> action):遍歷
  • default V getOrDefault(Object key, V defaultValue):key不存在或值為null,則返回默認值,否則返回當前值
  • map新增的方法:

    • getOrDefault
    • forEach
    • putIfAbsent
    • compute
    • computeIfAbsent
    • computeIfPresent
    • merge
    • remove(key,value)
    • replace
    • replaceAll

    getOrDefault

    default V getOrDefault(Object key, V defaultValue) {V v;return (((v = get(key)) != null) || containsKey(key))? v: defaultValue; }

    如果Map中不存在該key,可以提供一個默認值,方法會返回改默認值。如果存在該key,返回鍵對應的值。

    java8之前的寫法:

    Map<String, String> map = new HashMap<>(); String value = "D"; if(map.containsKey("d")) {value = map.get("d"); }

    java8:

    String value = map.getOrDefault("d", "D");

    forEach

    default void forEach(BiConsumer<? super K, ? super V> action) {Objects.requireNonNull(action);for (Map.Entry<K, V> entry : entrySet()) {K k;V v;try {k = entry.getKey();v = entry.getValue();} catch(IllegalStateException ise) {// this usually means the entry is no longer in the map.throw new ConcurrentModificationException(ise);}action.accept(k, v);} }

    forEach遍歷map,對map中的每個映射執行action指定的操作。
    比如:

    Map<String, String> map = new HashMap<>(); map.put("a", "A"); map.put("b", "B");// 遍歷 map.forEach((k, v)-> {System.out.println(k + "=" + v);map.put(k, k + v); }); // 輸出 // a=A // b=Bmap.forEach((k, v)-> {System.out.println(k + "=" + v); }); // 輸出 // a=aA // b=bB

    putIfAbsent

    default V putIfAbsent(K key, V value) {V v = get(key);if (v == null) {v = put(key, value);}return v; }

    V putIfAbsent(K key, V value)只有在不存在key值的映射或者映射值為null,才將value值賦值給key。否則不做修改。該方法將條件判斷和賦值合二為一。

    比如:

    Map<String, String> map = new HashMap<>(); map.put("a", "A"); map.put("b", "B");String e = map.putIfAbsent("e", "E"); String b = map.putIfAbsent("b", "E"); System.out.println("返回e="+e); //返回e=null System.out.println("鍵e="+map.get("e"));//鍵e=E System.out.println("返回b="+b);//返回b=B System.out.println("鍵b="+map.get("b"));//鍵b=B

    remove(key,value)

    default boolean remove(Object key, Object value) {Object curValue = get(key);if (!Objects.equals(curValue, value) ||(curValue == null && !containsKey(key))) {return false;}remove(key);return true; }

    只有在當前Map中key映射的值等于value時才刪除該映射,否則什么也不做。

    Map<String, String> map = new HashMap<>(); map.put("a", "A"); map.put("b", "B");map.remove("a", "B"); map.remove("b", "B"); System.out.println(map.get("a")); // A System.out.println(map.get("b")); // null

    replace(K key, V value)

    default V replace(K key, V value) {V curValue;if (((curValue = get(key)) != null) || containsKey(key)) {curValue = put(key, value);}return curValue; }

    只有在當前Map中包含key,才用value去替換原來的值,否則什么也不做。

    Map<String, String> map = new HashMap<>(); map.put("a", "A"); map.put("b", "B");map.replace("c", "1"); map.replace("b", "1"); System.out.println(map.get("c")); // null System.out.println(map.get("b")); // 1

    replace(K key, V oldValue, V newValue)

    default boolean replace(K key, V oldValue, V newValue) {Object curValue = get(key);if (!Objects.equals(curValue, oldValue) ||(curValue == null && !containsKey(key))) {return false;}put(key, newValue);return true; }

    只有在當前Map中key的映射存在且映射的值等于oldValue時才用newValue去替換原來的值,否則什么也不做。

    Map<String, String> map = new HashMap<>(); map.put("a", "A"); map.put("b", "B");map.replace("a", "1", "2"); map.replace("b", "B", "2"); System.out.println(map.get("a")); // A System.out.println(map.get("b")); // 2

    replaceAll

    default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {Objects.requireNonNull(function);for (Map.Entry<K, V> entry : entrySet()) {K k;V v;try {k = entry.getKey();v = entry.getValue();} catch(IllegalStateException ise) {// this usually means the entry is no longer in the map.throw new ConcurrentModificationException(ise);}// ise thrown from function is not a cme.v = function.apply(k, v);try {entry.setValue(v);} catch(IllegalStateException ise) {// this usually means the entry is no longer in the map.throw new ConcurrentModificationException(ise);}} }

    該方法簽名為replaceAll(BiFunction<? super K,? super V,? extends V> function),作用是對Map中的每個映射執行function指定的操作,并用function的執行結果替換原來的value

    比如:

    Map<String, String> map = new HashMap<>(); map.put("a", "A"); map.put("b", "B");map.replaceAll((k, v) -> v.toLowerCase()); map.forEach((k, v)-> {System.out.println(k + "=" + v); });// a=a // b=b

    merge

    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; }

    value和remappingFunction不能為null
    如果Map中key對應的映射不存在或者為null,則將value關聯到key上;否則執行remappingFunction,如果執行結果為null則刪除key的映射,否則用該結果跟key關聯。

    比如:

    Map<String, String> map = new HashMap<>(); map.put("e", "E"); map.merge("f", "F", String::concat); map.merge("e", "F", String::concat); System.out.println("map.get(\"f\")="+map.get("f")); // map.get("f")=F System.out.println("map.get(\"e\")="+map.get("e")); // map.get("e")=EF

    compute

    default V compute(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction) {Objects.requireNonNull(remappingFunction);// 獲取key對應的值V oldValue = get(key);//獲取新值V newValue = remappingFunction.apply(key, oldValue);// 如果新值為null,并且key存在,則刪除key;否則把新值賦值給keyif (newValue == null) {// delete mappingif (oldValue != null || containsKey(key)) {// something to removeremove(key);return null;} else {// nothing to do. Leave things as they were.return null;}} else {// add or replace old mappingput(key, newValue);return newValue;} }

    比如:

    Map<String, String> map = new HashMap<>(); map.put("b", "B"); String val = map.compute("b", (k, v) -> null); String val2 = map.compute("c", (k, v) -> v + "+v"); System.out.println(val); // null System.out.println(val2); // null+v

    computeIfAbsent

    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; }

    當Map中不存在key值的映射或映射值為null時,調用mappingFunction,并在mappingFunction執行結果非null時,將結果賦值給key。

    比如(輸入每個字母的位置):

    List<String> list = Lists.newArrayList("a", "b", "b", "c", "c", "c", "d", "d", "d", "f", "f", "g"); Map<String, List<Integer>> positionsMap = new HashMap<>(); for (int i = 0; i < list.size(); i++) {positionsMap.computeIfAbsent(list.get(i), k -> Lists.newArrayListWithCapacity(1)).add(i); }System.out.println(positionsMap); // {a=[0], b=[1, 2], c=[3, 4, 5], d=[6, 7, 8], f=[9, 10], g=[11]}

    總結

    以上是生活随笔為你收集整理的java8 Map新增方法的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。