【java代碼之美】---Java8 Map中的computeIfAbsent方法

來源:互聯網
上載者:User

標籤:開發   col   記錄   代碼品質   一個   個數   lang   oid   商務邏輯   

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);        //輸出:{[email protected], [email protected]}    }    /**     * 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)

 

【java代碼之美】---Java8 Map中的computeIfAbsent方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.