随笔 - 416  文章 - 0  评论 - 842  阅读 - 273万

java代码之美(10)---Java8 Map中的computeIfAbsent方法

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);
        //输出:{key1=java.lang.Object@708f5957, key=java.lang.Object@68999068}
    }


    /**
     * 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)

 

posted on   雨点的名字  阅读(13130)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了

点击右上角即可分享
微信分享提示

目录导航