zoukankan      html  css  js  c++  java
  • 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());
  • 相关阅读:
    47种常见的浏览器兼容性问题大汇总
    201521123029《java程序设计》第2周学习总结
    201521123029《Java程序设计》第1周学习总结
    201521123022 《Java程序设计》 第一周学习总结
    201521123020《java程序设计》第1周学习总结
    Java程序设计第三周学习总结
    201521123021第二周Java学习总结
    201521123021《Java程序设计》第1周学习总结
    201521123017 《Java程序设计》第1周学习总结
    201521123028 《Java程序设计》第2周学习总结
  • 原文地址:https://www.cnblogs.com/zhenbian/p/12964020.html
Copyright © 2011-2022 走看看