解读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));

总结

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

相关文章

  • Java权重随机的实现方法

    Java权重随机的实现方法

    这篇文章主要介绍了Java权重随机的实现方法,实例分析了权重随机算法的原理与完整实现方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • logback关闭某个包的日志操作

    logback关闭某个包的日志操作

    这篇文章主要介绍了logback关闭某个包的日志操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Java中long类型与Long类型的区别和大小比较详解

    Java中long类型与Long类型的区别和大小比较详解

    这篇文章主要给大家介绍了Java中long类型与Long类型区别和大小比较的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • 九个动画组图轮播总结全栈数据结构数组链表

    九个动画组图轮播总结全栈数据结构数组链表

    数据结构和算法是密不可分的,两者往往是相辅相成的存在,所以在学习数据结构过程中,不免会遇到各种算法,数据结构常用操作一般为:增删改查。基本上所有的数据结构都是围绕这几个操作进行展开,本文用九张动图来阐述先进后出的数据结构
    2021-08-08
  • Java中HashSet和LinkedHashSet详解

    Java中HashSet和LinkedHashSet详解

    这篇文章主要介绍了Java中HashSet和LinkedHashSet详解,   HashSet是Set接口的子类,其内部采用了HashMap作为数据存储,HashSet其实就是在操作HashMap的key,HashSet是无序存储的,不能保证元素的顺序;HashSet并没有进行同步处理,因此是线程不安全的,需要的朋友可以参考下
    2023-09-09
  • Java开发第一个RESTful接口完全攻略

    Java开发第一个RESTful接口完全攻略

    restful接口是一种基于http协议的网络应用程序接口设计风格,它强调资源的表现形式和状态转移,下面这篇文章主要介绍了Java开发RESTful接口的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-01-01
  • java获取中文拼音首字母的实例

    java获取中文拼音首字母的实例

    下面小编就为大家带来一篇java获取中文拼音首字母的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Java爬虫范例之使用Htmlunit爬取学校教务网课程表信息

    Java爬虫范例之使用Htmlunit爬取学校教务网课程表信息

    htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。今天我们用这款分析工具来爬取学校教务网课程表信息
    2021-11-11
  • spring-logback引用外部文件实现方式

    spring-logback引用外部文件实现方式

    本文介绍了如何在Spring微服务开发中实现统一的日志配置,包括使用logback的继承方式和spring-logback.xml配置,以及如何解决logback-include.xml文件在jar包中的位置问题,通过这种方式,可以在统一的日志格式和存储方式下,给予服务一定程度的自主控制
    2025-11-11
  • SpringBoot中的@RequestMapping注解的用法示例

    SpringBoot中的@RequestMapping注解的用法示例

    @RequestMapping注解是SpringBoot中最常用的注解之一,它可以帮助开发者定义和处理HTTP请求,本篇文章我们将详细为大家介绍如何使用SpringBoot中的@RequestMapping注解,感兴趣的同学跟着小编一起来学习吧
    2023-06-06

最新评论