Java中Map的computeIfAbsent方法详解

 更新时间:2023年11月30日 11:11:28   作者:啊几  
这篇文章主要介绍了Java的Map中computeIfAbsent方法详解,在jdk1.8中Map接口新增了一个computeIfAbsent方法,这是Map接口中的默认实现该方法是首先判断缓存Map中是否存在指定的key的值,如果不存在,会调用mappingFunction(key)计算key的value,需要的朋友可以参考下

前言

在jdk1.8中Map接口新增了一个computeIfAbsent方法,这是Map接口中的默认实现

default V computeIfAbsent(K key,
            Function<? super K, ? extends V> mappingFunction) {
        Objects.requireNonNull(mappingFunction);
        V v;
        if ((v = get(key)) == null) {
            V newValue;
            if ((newValue = mappingFunction.apply(key)) != null) {
                put(key, newValue);
                return newValue;
            }
        }
        return v;
    }

该方法是首先判断缓存Map中是否存在指定的key的值,如果不存在,会调用mappingFunction(key)计算key的value,然后将key = value 放入缓存Map中。

但如果mappingFunction(key)计算出来的value为null或抛出异常,则不会记录缓存。

代码实例

例1

/**
 * 如果key对应的value值为null,则在map中放入该key和设置相应的value
 */
public class Test {
    public static void main(String[] args) {
        Map<Integer,Integer> map = new HashMap<>();
        /**
         * 方法1:使用方法引用
         */
        map.computeIfAbsent(1,Test::compute);
        /**
         * 方法2:使用匿名内部类
         */
        map.computeIfAbsent(1, new Function<Integer, Integer>() {
            @Override
            public Integer apply(Integer integer) {
                return integer;
            }
        });
        /**
         * 方法3:使用lambda
         */
        map.computeIfAbsent(1,key -> key);
        
        System.out.println(map.get(1));
    }

    static public Integer compute(Integer integer){
        return integer;
    }
}

例2

/**
 * 统计List出现相同字符串的个数
 */
public class Test {
    public static void main(String[] args) {
        Map<String,AtomicInteger> map = new HashMap<>();
        List<String> list = Arrays.asList(new String[]{"1","2","2","3","3","4","4","4"});
        list.forEach(str->map.computeIfAbsent(str,k->new AtomicInteger()).incrementAndGet());
        System.out.println(map);
    }
}
/**
 * {1=1, 2=2, 3=2, 4=3}
 */

这里用了两次lambda,和下面方法是一样

/**
 * 统计List出现相同字符串的个数
 */
public class Test {
    public static void main(String[] args) {
        Map<String,AtomicInteger> map = new HashMap<>();
        List<String> list = Arrays.asList(new String[]{"1","2","2","3","3","4","4","4"});
        list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                //寻找map中key对应的value,如果map不存在指定key的值则new 一个AtomicInteger对象并加入缓存map中,如果存在则取到对应的AtomicInteger对象并加一
                map.computeIfAbsent(s, new Function<String, AtomicInteger>() {
                    @Override
                    public AtomicInteger apply(String s) {
                        return new AtomicInteger();
                    }
                }).incrementAndGet();
            }
        });
        System.out.println(map);
    }
}
/**
 * {1=1, 2=2, 3=2, 4=3}
 */

总结

computeIfAbsent在一些实际开发场景中,能让我们代码看去更加简洁,代码质量看去也更高。

到此这篇关于Java中Map的computeIfAbsent方法详解的文章就介绍到这了,更多相关Map的computeIfAbsent方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 用Java进行zip文件压缩与解压缩

    用Java进行zip文件压缩与解压缩

    这篇文章主要介绍了用Java进行zip文件压缩与解压缩的方法,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-12-12
  • springboot2 jackson实现动态返回类字段方式

    springboot2 jackson实现动态返回类字段方式

    这篇文章主要介绍了springboot2 jackson实现动态返回类字段方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • springmvc如何使用map接收参数

    springmvc如何使用map接收参数

    这篇文章主要介绍了springmvc如何使用map接收参数的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • mybatis-plus多表分页查询最佳实现方法(非常简单)

    mybatis-plus多表分页查询最佳实现方法(非常简单)

    这篇文章主要给大家介绍了关于mybatis-plus多表分页查询最佳实现方法,文中介绍的方法非常简单,MyBatis-Plus中分页查询是比较方便的,这个功能在网站中也是非常常用的,这方面的知识点是必备的知识点,需要的朋友可以参考下
    2023-08-08
  • Java Collections.sort()排序代码案例

    Java Collections.sort()排序代码案例

    这篇文章主要介绍了Java Collections.sort()排序代码案例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • Eclipse创建java程序可执行jar包教程

    Eclipse创建java程序可执行jar包教程

    这篇文章主要为大家分享了Eclipse创建java程序可执行jar包教程,具有一定的实用性和参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 详解Java Bellman-Ford算法原理及实现

    详解Java Bellman-Ford算法原理及实现

    Bellman-Ford算法与Dijkstra算法类似,都是以松弛操作作为基础,Bellman-Ford算法是对所有边都进行松弛操作,本文将详解Bellman-Ford算法原理及实现,感兴趣的可以了解一下
    2022-07-07
  • kafka 消息队列中点对点与发布订阅的区别说明

    kafka 消息队列中点对点与发布订阅的区别说明

    这篇文章主要介绍了kafka 消息队列中点对点与发布订阅的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Spring AOP配置文件方式入门教程详解

    Spring AOP配置文件方式入门教程详解

    spring aop是一个面向切面的编程,在自己第一遍学习的时候,感觉aop没有什么作用,但是真实接触下来,感觉spring aop还是很有用途的,这篇文章主要介绍了Spring AOP配置文件方式入门教程的相关资料,需要的朋友可以参考下
    2025-11-11
  • 使用Feign扩展包实现微服务间文件上传

    使用Feign扩展包实现微服务间文件上传

    这篇文章主要为大家详细介绍了使用Feign扩展包实现微服务间文件上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04

最新评论