java代碼之美(10)---Java8 Map中的computeIfAbsent方法


Map中的computeIfAbsent方法

 

Map接口的實現類如HashMap,ConcurrentHashMap,HashTable等繼承了此方法,通過此方法可以在特定需求下,讓你的代碼更加簡潔。

一、案例說明

1、概述

    在JAVA8的Map接口中,增加了一個方法computeIfAbsent,此方法簽名如下:

public V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction) 

    此方法首先判斷緩存MAP中是否存在指定key的值,如果不存在,會自動調用mappingFunction(key)計算key的value,然后將key = value放入到緩存Map。

如果mappingFunction(key)返回的值為null或拋出異常,則不會有記錄存入map

 

2、代碼說明

public class Java8Map {

    public Map<String,Object>  map1= Maps.newHashMap();

    public Map<String,AtomicInteger>  map2=Maps.newHashMap();

    public Map<String,List<String>>  map3=Maps.newHashMap();

    List<String> list = Lists.newArrayList("1", "2", "3","2","3","2");

    /**
     * 1、業務邏輯:如果key的value值為null,則在map中放入該key和設置相應的value值 */
    @Test
    public  void  map1(){

        // java8之前,從map中根據key獲取value操作可能會有下面的操作
        Object key = map1.get("key");
        if (key == null) {
            key = new Object();
            map1.put("key", key);
        }else{
            //如果key對應的value值存在,進行相應的操作
        }

        // java8之后,上面的操作可以簡化為一行,若key對應的value為空,會將第二個參數的返回值存入並返回
        Object key2 = map1.computeIfAbsent("key1", k -> new Object());
        System.out.println(map1);
        //輸出:{key1=java.lang.Object@708f5957, key=java.lang.Object@68999068}
    }


    /**
     * 2、統計List出現相同字符串的個數 */
    @Test
    public void  map2() {

        //這里雖然只有一行代碼但信息量很大,首先它采用量java的新特性lambda表達式來遍歷list集合
        //這里表示如果map中的key對應的value值為null,則該key對應value值為new AtomicInteger()並執行自增加1,如果key已經存在,則直接value值自增1
        list.forEach( str-> map2.computeIfAbsent(str, k -> new AtomicInteger()).incrementAndGet());
        System.out.println(map2);
        //輸出:{1=1, 2=3, 3=2}

    }

    /**
     * 3、如果key對應的value不存在,則創建新List並放入數據,存在則往直接往list放入數據 */
    @Test
    public void  map3() {

        map3.computeIfAbsent("zhangsan", k -> genValue(k)).add("apple");
        map3.computeIfAbsent("zhangsan", k -> genValue(k)).add("orange");
        map3.computeIfAbsent("zhangsan", k -> genValue(k)).add("pear");
        map3.computeIfAbsent("zhangsan", k -> genValue(k)).add("banana");
        map3.computeIfAbsent("lisi", k -> genValue(k)).add("water");

        System.out.println(map3);
        //輸出結果:{lisi=[water], zhangsan=[apple, orange, pear, banana]}

    }

    static List<String> genValue(String str) {
        return new ArrayList<String>();
    }
    
}

總結:computeIfAbsent在一些實際開發場景中,能讓我們代碼看去更加簡潔,代碼質量看去也更高。

有關下面這步確實很優秀。它知道我map里的value是什么類型從而可以調相應的方法,比如這里是AtomicInteger對象,那就可以調incrementAndGet()方法

如果你放的是集合就可以調集合相關方法。

list.forEach( str-> map2.computeIfAbsent(str, k -> new AtomicInteger()).incrementAndGet());

 

 

 我只是偶爾安靜下來,對過去的種種思忖一番。那些曾經的舊時光里即便有過天真愚鈍,也不值得譴責。畢竟,往后的日子,還很長。不斷鼓勵自己,

 天一亮,又是嶄新的起點,又是未知的征程(上校1)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM