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());
  • 相关阅读:
    什么是 bean 的自动装配?
    什么是 Spring 的内部 bean?
    什么是 Spring 的 MVC 框架?
    Spring AOP and AspectJ AOP 有什么区别?
    解释 JDBC 抽象和 DAO 模块?
    volatile 类型变量提供什么保证?
    一个 Spring Bean 定义 包含什么?
    什么是 Spring MVC 框架的控制器?
    使用 Spring 访问 Hibernate 的方法有哪些?
    什么是 Callable 和 Future?
  • 原文地址:https://www.cnblogs.com/zhenbian/p/12964020.html
Copyright © 2011-2022 走看看