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



 

Map中的computeIfAbsent方法


 

一、案例說明

 

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@277c0f21, key=java.lang.Object@6073f712}
    }
    @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}
    }
    @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());

 


免責聲明!

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



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