解读Map中的computeIfAbsent方法

 更新时间:2026年05月05日 10:49:04   作者:naruto227  
文章介绍了Java 8中Map接口的computeIfAbsent方法,该方法用于在Map中获取指定键的值,如果不存在则调用提供的函数计算值并放入Map中,并给出了使用示例

1、概述

在JAVA8的Map接口中,增加了一个computeIfAbsent,方法签名如下:

default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)

Function是一个函数式接口

R apply(T t);

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

如果mappingFunction(key)返回的值为null或抛出异常,则不会有记录存入map

2、代码示例

2.1 示例1

Map<String, String> map = new HashMap<>();
// java8之前,从map中根据key获取value操作可能会下面的操作
String key = map.get("key");
if (key == null) {
    key = "hh";
    map.put("key", key);
} else {
    // 如果key对应的value值存在,进行相应的操作
}

// java8之后,上面的操作可以简化为一行,若key的value值为空,会将第二个参数的返回值存入并返回
String val = map.computeIfAbsent("key1", k -> "test");
System.out.println(map);
// 打印:{key1=test, key=hh}

2.2 示例2

Map<String, AtomicInteger> map = new HashMap<>();
// 统计字段出现个数
List<String> list = Lists.newArrayList("apple", "orange", "banana", "orange", "banana",
                                       "orange");
list.forEach(str -> map.computeIfAbsent(str, k -> new AtomicInteger()).getAndIncrement());
// 遍历
map.forEach((k, v) -> System.out.println(k + ": " + v));

2.2 示例3

Map<String, List<String>> map = new HashMap<>();
// 如果key不存在,则创建新list并放入数据;key存在,则直接往list放入数据
map.computeIfAbsent("fruit", k -> new ArrayList<>()).add("apple");
map.computeIfAbsent("fruit", k -> new ArrayList<>()).add("orange");
map.computeIfAbsent("language", k -> new ArrayList<>()).add("english");
// 遍历
map.forEach((k, v) -> System.out.println(k + " " + v));
 遍历
map.forEach((k, v) -> System.out.println(k + " " + v));

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MyBatis直接执行SQL的工具SqlMapper

    MyBatis直接执行SQL的工具SqlMapper

    今天小编就为大家分享一篇关于MyBatis直接执行SQL的工具SqlMapper,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Java中常量池、堆和栈的区别对比与联系

    Java中常量池、堆和栈的区别对比与联系

    Java中堆存储对象实例和字符串(JDK7+),栈保存方法调用信息与局部变量,常量池缓存编译期常量,三者通过引用关联,堆与栈区分对象创建与存储,常量池优化内存复用,本文给大家介绍Java中常量池、堆和栈的区别对比与联系,感兴趣的朋友一起看看吧
    2025-09-09
  • Java中Semaphore(信号量)的使用方法

    Java中Semaphore(信号量)的使用方法

    这篇文章主要介绍了Java中Semaphore(信号量)的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • java实现事件委托模式的实例详解

    java实现事件委托模式的实例详解

    这篇文章主要介绍了java实现事件委托模式的实例详解的相关资料,这里提供实例来说明如何实现改功能,希望能帮助到大家理解这样的模式,需要的朋友可以参考下
    2017-08-08
  • 详解java nio中的select和channel

    详解java nio中的select和channel

    这篇文章主要介绍了java nio中的select和channel
    2019-05-05
  • springboot2.0+elasticsearch5.5+rabbitmq搭建搜索服务的坑

    springboot2.0+elasticsearch5.5+rabbitmq搭建搜索服务的坑

    这篇文章主要介绍了springboot2.0+elasticsearch5.5+rabbitmq搭建搜索服务的坑,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Spring中获取HttpServletRequest的三种方式小结

    Spring中获取HttpServletRequest的三种方式小结

    spring框架web环境中,获取HttpServletRequest是常见的操作,本文将为大家详细介绍一下Spring中获取HttpServletRequest的三种方式,有需要的小伙伴可以了解下
    2026-04-04
  • Java中的对象流总结(必看篇)

    Java中的对象流总结(必看篇)

    下面小编就为大家带来一篇Java中的对象流总结(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Java将json字符串转换为数组的几种方法

    Java将json字符串转换为数组的几种方法

    在Java开发中,经常会遇到将json字符串转换为数组的需求,本文主要介绍了Java将json字符串转换为数组的几种方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 深入理解Netty核心类及其作用

    深入理解Netty核心类及其作用

    本文介绍了Netty框架中的核心类及其作用,包括Channel、EventLoop、ChannelPipeline、ByteBuf等,通过对这些类的深入理解,可以更好地使用Netty进行网络编程开发
    2023-04-04

最新评论