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());