一文讲透 map.computeIfAbsent putIfAbsent computeIfPresent区别

map.computeIfAbsent

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

如果 key 对应的 value 不存在,则使用获取 mappingFunction 计算后的值,并保存为该 key 的 value,否则返回 value。

import java.util.HashMap;HashMap<Integer, Integer> hashmap=new HashMap<Integer, Integer>();
hashmap.computeIfAbsent(10, key->Integer.valueOf(7));HashMap<Integer, ArrayList<Integer>> hashmap=new HashMap<Integer, ArrayList<Integer>>();
hashmap.computeIfAbsent(10, key->new ArrayList<Integer>()).add(3);HashMap<String, Integer> prices = new HashMap<>();prices.put("Shoes", 200);
prices.put("Bag", 300);
prices.put("Pant", 150);// 计算 Shirt 的值
int shirtPrice = prices.computeIfAbsent("Shirt", key -> 280);

// java8 之前。从 map 中根据 key 获取 value 操作可能会有下面的操作

Object key = map.get("key");
if (key == null) {key = new Object();map.put("key", key);
}
// java8 lambda
Object key = map.computeIfAbsent("key", k -> new Object());

getOrDefault

default V getOrDefault(Object key, V defaultValue)

如果在 map 中存在 key 值则返回 key 对应的映射中的内容,否则返回指定的内容。

HashMap<Integer, Integer> hashmap=new HashMap<Integer, Integer>();
// 不存在 key 值,取 8,同时 key 赋值 8
int test = hashmap.computeIfAbsent(10, key->Integer.valueOf(8)); 
int test2=hashmap.getOrDefault(11, 8); // 不存在 key 值,取 8,不赋值

Map put putIfAbsent

V put(K key, V value);
V putIfAbsent(K key, V value);

这两种方法都是以 key-value 键值对的形式存在到 map 集合中,那么它们两个有什么区别呢?

1.使用 put 方法添加键值对,如果 map 集合中没有该 key 对应的值,则直接添加,并返回 null,如果已经存在对应的值,则会覆盖旧值,value 为新的值。

2.使用 putIfAbsent 方法添加键值对,如果 map 集合中没有该 key 对应的值,则直接添加,并返回 null,如果已经存在对应的值,则依旧为原来的值。

java.util.Map putIfAbsent computeIfAbsent computeIfPresent compute
putIfAbsent
default V putIfAbsent(K key,V value)

如果给定的 key 不存在(或者 key 对应的 value 为 null),关联给定的 key 和给定的 value,并返回 null;如果存在,返回当前值(不会把 value 放进去);

computeIfAbsent
default V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)
map.computeIfAbsent(key, k -> new Value(f(k)));
map.computeIfAbsent(key, k -> new HashSet<V>()).add(v);

如果给定的 key 不存在(或者 key 对应的 value 为 null),就去计算 mappingFunction 的值;

如果 mappingFunction 的值不为 null,就把 key = value 放进去;
如果 mappingFunction 的值为 null,就不会记录该映射关系,返回值为 null;
如果计算 mappingFunction 的值的过程出现异常,再次抛出异常,不记录映射关系,返回 null;
如果存在该 key,并且 key 对应的 value 部位 null,返回 null;(HashMap 返回的是旧 value)

computeIfPresent
default V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)

key 存在并且不为空,计算 remappingFunction 的值 value;

如果 value 不为空,保存指定 key 和 value 的映射关系;
如果 value 为 null,remove(key);
如果计算 value 的过程抛出了异常,computeIfPresent 方法中会再次抛出,key 和其对应的值不会改变

compute

default V compute(K key,BiFunction<? super K,? super V,? extends V> remappingFunction)
map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg))
(Method merge() is often simpler to use for such purposes.)V oldValue = map.get(key);V newValue = remappingFunction.apply(key, oldValue);if (oldValue != null ) {if (newValue != null)map.put(key, newValue);elsemap.remove(key);} else {if (newValue != null)map.put(key, newValue);elsereturn null;}

如果 lambda 表达式的值不为空,不论 key 是否已经存在,建立一种映射关系 key = newValue; 否则,不建立映射并返回 null。

putIfAbsent、computeIfAbsent、computeIfPresent、compute的区别

putIfAbsent 和 computeIfAbsent
都是在 key 不存在的时候才会建立 key 和 value 的映射关系;
putIfAbset 不论传入的 value 是否为空,都会建立映射(并不适合所有子类,例如 HashTable),而computeIfAbsent 方法,当存入value为空时,不做任何操作
当 key 不存在时,返回的都是新的 value(为什么不说新插入的 value),即使 computeIfAbsent 在传入的value 为 null 时,不会新建映射关系,但返回的也是 null;

computeIfPresent 和 computeIfAbsent
这两个方法正好相反,前者是在key存在时,才会用新的value替换oldValue
当传入的key存在,并且传入的value为null时,前者会remove(key),把传入的key对应的映射关系移除;而后者不论何时都不会remove();
前者只有在key存在,并且传入的value不为空的时候,返回值是value,其他情况都是返回null;后者只有在key不存在,并且传入的value不为null的时候才会返回value,其他情况都返回null;

compute
新传入的 value 不为 null 就建立映射关系(也就是说不论 key 是否为 null,具体子类再具体分析)
新传入的 value 为 null 时:key 已存在,且老的对应 value 不为 null,移除改映射关系,返回 null;否则,直接返回 null

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/705926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将python两个版本添加环境变量(Mac版)

在运行程序的时候&#xff0c;可能不知道选择哪个版本的程序来执行&#xff0c;先添加环境变量&#xff0c;然后进行选择。 1、查看python安装路径 which python which python3 来查看各个版本的安装位置 2、编辑环境变量配置文件 Macos使用默认终端的shell是bash&#xff0c…

c入门第二十三篇: 学生成绩管理系统优化(支持远程操作)

前言 师弟高兴的说道&#xff1a;“师兄&#xff0c;你猜我今天上课看见谁了&#xff1f;” 我&#xff1a;“谁呢&#xff1f;” 师弟&#xff1a;“程夏&#xff0c;没想到&#xff0c;她竟然来旁听我们计算机系的课程了。虽然我从前门进去的&#xff0c;但是我还是一眼就看…

swing jdk版本导致的显示尺寸不一致问题

Java Swing JFrame size different after upgrade to JRE11 from JRE 7 or 8. How can I make the frame size consistent? - Stack Overflow 从 JRE 7 或 8 升级到 JRE11 后&#xff0c;Java Swing JFrame 大小不同。如何使帧大小一致&#xff1f; - IT工具网 设置虚拟机选项…

01背包问题:组合问题

01背包问题&#xff1a;组合问题 题目 思路 将nums数组分成left和right两组&#xff0c;分别表示相加和相减的两部分&#xff0c;则&#xff1a; left - right targetleft right sum 进而得到left为确定数如下&#xff0c;且left必须为整数&#xff0c;小数表示组合不存在&…

SSM框架,MyBatis框架的学习(上)

MyBatis简介 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Ja…

28. 找出字符串中第一个匹配项的下标(力扣LeetCode)

文章目录 28. 找出字符串中第一个匹配项的下标题目描述暴力KMP算法 28. 找出字符串中第一个匹配项的下标 题目描述 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。…

mapbox高德地图与相机

mapbox高德地图与相机 本案例使用Mapbox GL JavaScript库创建高德地图。 演示效果引入 CDN 链接地图显示 创建地图实例定义地图数据源配置地图图层 设置地图样式实现代码 1. 演示效果 2. 引入 CDN 链接 <script src"https://api.mapbox.com/mapbox-gl-js/v2.12.0/mapb…

Android虚拟机Dalvik和ART

前言&#xff1a;Android虚拟机包括Dalvik和ART&#xff0c;它们是用于在Android设备上运行应用程序的关键组件。 Dalvik虚拟机&#xff1a; 1. 设计目的&#xff1a; Dalvik虚拟机是在Android早期版本中使用的虚拟机&#xff0c;其设计目的是为了在资源受限的移动设备上执…

项目实战:Qt监测操作系统cpu温度v1.1.0(支持windows、linux、国产麒麟系统)

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/136277231 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

全面升级!Apache HugeGraph 1.2.0版本发布

图数据库以独特的数据管理和分析能力&#xff0c;在企业数智化转型的过程中正在成为数据治理的核心&#xff0c;根据IDC调研显示&#xff0c;95%的企业认为图数据库是重要的数据管理工具&#xff0c;超过65%的厂商认为在业务上图数据库优于其他选择&#xff0c;尤其是在金融风控…

Linux设备模型(四) - uevent应用:内核发送uevent,用户空间接收uevent

1&#xff0c;内核发送uevent 内核发送uevent的API由lib/kobject_event.c文件实现&#xff0c;include/linux/kobject.h是头文件。 enum kobject_action {KOBJ_ADD,KOBJ_REMOVE,KOBJ_CHANGE,KOBJ_MOVE,KOBJ_ONLINE,KOBJ_OFFLINE,KOBJ_MAX };/* kobject_uevent不能用在中断上下…

2024年2月19日-2月25日(全面进行+收集免费虚幻商城资源,20小时,合计2561小时,剩余7439小时)

试试周一到周五重点进行&#xff0c;周末抄写源码&#xff0c;周一晚上看书很快就在22&#xff1a;00睡着&#xff0c;早上可以看看视频教程&#xff0c;出租车上补觉。 执行如下&#xff1a; 周一&#xff1a; 8&#xff1a;01-9&#xff1a;20ue4 rpg&#xff08;184&#xf…

Unity零基础到进阶 | Unity中的 RectTransformUtility 方法整理汇总

Unity零基础到进阶 ☀️| RectTransformUtility 方法整理汇总一、RectTransformUtility 官方文档1.1 RectTransformUtility.CalculateRelativeRectTransformBounds&#xff08;重&#xff09;1.2 RectTransformUtility.FlipLayoutAxes1.3 RectTransformUtility.FlipLayoutOnAxi…

观察者模式与发布订阅模式

观察者模式 定义&#xff1a; 观察者模式是一种行为型设计模式&#xff0c;定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 结构图&#xff1a; ES6简易代码实现&#xff1a; //ts环境下…

Nginx——安装和反向代理

Nginx安装与应用 1.1 Nginx介绍 Nginx 是一个高性能的HTTP和反向代理服务器,特点是占有内存少&#xff0c;并发能力强 Nginx可以作为静态页面的web服务器&#xff0c;同时还支持CGI协议的动态语言&#xff0c;比如perl、php等。但是不支持java。Java程序只能通过与tomcat配合…

谷歌AI发展史:从阿尔法围棋到Gemini与Gemma的开源创新

谷歌一直是人工智能领域的重要推动者。本文将回顾谷歌AI的发展历程&#xff0c;从阿尔法围棋到现如今的Gemini和Gemma&#xff0c;探讨谷歌在人工智能领域的重大突破和创新。 1. 引言 在计算机科学领域&#xff0c;谷歌一直是人工智能&#xff08;AI&#xff0…

华为OD机试真题-数的分解-2023年OD统一考试(C卷)--Python3-开源

参考链接&#xff1a; 华为OD机试真题-用连续自然数之和来表达整数-2023年OD统一考试&#xff08;C卷&#xff09;—python代码免费

MasterAlign全景视觉点胶应用软件说明书

MasterAlign视觉软件通过高精度的图像处理和机器学习算法&#xff0c;实现了对点胶过程的全面控制和管理。以下是关于MasterAlign在全景视觉点胶应用场景中如何使用的详细说明。看完全文相信一定能让您快速上手使用。

刷题第1天:leetcode704--数组元素查找--二分法查找算法

第一部分---数组的基础知识介绍&#xff1a; 1.数组的定义&#xff1a;数组是存放在连续内存空间上的相同数据类型的数据的集合&#xff1b; 2.数组可以通过下标索引的方式获取到下标对应的数据&#xff1b; 3.数组下标是从0开始的&#xff0c;数组的内存空间地址是连续的&a…

多维时序 | Matlab实现CPO-BiTCN-BiGRU冠豪猪优化时间卷积神经网络双向门控循环单元多变量时间序列预测模型

多维时序 | Matlab实现CPO-BiTCN-BiGRU冠豪猪优化时间卷积神经网络双向门控循环单元多变量时间序列预测模型 目录 多维时序 | Matlab实现CPO-BiTCN-BiGRU冠豪猪优化时间卷积神经网络双向门控循环单元多变量时间序列预测模型预测效果基本介绍程序设计参考资料 预测效果 基本介绍…