Map的compute方法详解(Java)

1.compute方法

compute 方法是 Map 接口中的一个方法,用于根据指定的键和计算函数对指定键的值进行修改
方法的签名如下:

default V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
  • key:要操作的键。
  • remappingFunction:一个接收键和当前键对应的值作为输入,并返回一个新值的函数。

compute 方法的行为取决于指定的键当前是否存在于 Map

  1. 如果指定的键存在且对应的值不为 null,则将键和对应的值传递给 remappingFunction 函数。该函数返回的值将作为新的键值对中的值。如果函数返回的值为 null,则会从 Map 中删除该键。
  2. 如果指定的键不存在或其对应的值为 null,则 remappingFunction 函数将不会执行,compute 方法直接返回 null

示例:

import java.util.HashMap;
import java.util.Map;public class ComputeExample {public static void main(String[] args) {// 创建一个 HashMap 实例Map<String, Integer> map = new HashMap<>();// 添加键值对到 HashMapmap.put("key1", 10);map.put("key2", 20);map.put("key3", null);// 使用 compute 方法更新现有的键值对map.compute("key1", (k, v) -> v == null ? 1 : v + 1); // key1 存在,值为 10,将值更新为 11map.compute("key2", (k, v) -> v == null ? 1 : v + 1); // key2 存在,值为 20,将值更新为 21map.compute("key3", (k, v) -> v == null ? 1 : v + 1); // key3 存在,值为 null,将值更新为 1map.compute("key4", (k, v) -> v == null ? 1 : v + 1); // key4 不存在,直接返回 1// 输出更新后的 Map 内容System.out.println("Updated Map: " + map);}
}
  • 对于已存在的键值对:
    • 如果值为 null,则将值更新为 1
    • 如果值不为 null,则将原值加 1
  • 对于不存在的键值对(例如 "key4"):
    • remappingFunction 函数将不会执行,compute 方法直接返回 null,不会添加新的键值对。

输出更新后的 Map 内容,可以看到每个键值对根据 remappingFunction 的结果进行了更新或未发生改变。:

Updated Map: {key1=11, key2=21, key3=1}

这说明 compute 方法根据指定的函数对 Map 中的键值对进行了更新或操作。


2.computeIfAbsent方法

根据指定的键和计算函数在需要时对指定键的值进行修改。

方法的签名如下:

default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
  • key:要操作的键。
  • mappingFunction:一个接收键作为输入,并返回对应值的函数。

computeIfAbsent 方法的行为:

  1. 如果指定的键存在,并且对应的值不为 null,则直接返回该值,不会执行 mappingFunction 函数。
  2. 如果指定的键不存在,或者对应的值为 null,则执行 mappingFunction 函数,将函数返回的结果作为新的键值对中的值,并将其放入 Map

示例:

import java.util.HashMap;
import java.util.Map;public class ComputeIfAbsentExample {public static void main(String[] args) {// 创建一个 HashMap 实例Map<String, Integer> map = new HashMap<>();// 添加键值对到 HashMapmap.put("key1", 10);map.put("key2", 20);// 使用 computeIfAbsent 方法添加新的键值对map.computeIfAbsent("key1", k -> 100); // key1 存在,值为 10,不会执行 mappingFunctionmap.computeIfAbsent("key3", k -> 30);  // key3 不存在,执行 mappingFunction,将值 30 放入 Map// 输出更新后的 Map 内容System.out.println("Updated Map: " + map);}
}
  • 对于已存在的键值对:
    • 如果值不为 null,则直接返回原值,不会执行 mappingFunction 函数。
  • 对于不存在的键值对(例如 "key3"):
    • 执行 mappingFunction 函数,将函数返回的值作为新的键值对中的值,并将其放入 Map 中。

最后,我们输出更新后的 Map 内容,可以看到只有在键值对不存在时,mappingFunction 函数才会被执行

示例输出:

Updated Map: {key1=10, key2=20, key3=30}

3.computeIfPresent方法

键存在且对应的值不为 null 时对指定键的值进行修改

方法的签名如下:

default V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
  • key:要操作的键。
  • remappingFunction:一个接收键和当前键对应的值作为输入,并返回一个新值的函数。

computeIfPresent 方法的行为如下:

  1. 如果指定的键存在且对应的值不为 null,则将键和对应的值传递给 remappingFunction 函数。该函数返回的值将作为新的键值对中的值。如果函数返回的值为 null,则会从 Map 中删除该键
  2. 如果指定的键不存在或其对应的值为 null,则 remappingFunction 函数将不会执行,computeIfPresent 方法直接返回 null,不会修改 Map 中的任何内容

示例:

import java.util.HashMap;
import java.util.Map;public class ComputeIfPresentExample {public static void main(String[] args) {// 创建一个 HashMap 实例Map<String, Integer> map = new HashMap<>();// 添加键值对到 HashMapmap.put("key1", 10);map.put("key2", 20);// 使用 computeIfPresent 方法更新现有的键值对map.computeIfPresent("key1", (k, v) -> v * 2); // key1 存在,值为 10,将值更新为 20map.computeIfPresent("key2", (k, v) -> v * 2); // key2 存在,值为 20,将值更新为 40map.computeIfPresent("key3", (k, v) -> v * 2); // key3 不存在,不会执行 remappingFunction// 输出更新后的 Map 内容System.out.println("Updated Map: " + map);}
}
  • 对于已存在的键值对:
    • 如果值不为 null,则将键和对应的值传递给 remappingFunction 函数,并将函数返回的值作为新的键值对中的值。
  • 对于不存在的键值对(例如 "key3"):
    • remappingFunction 函数将不会执行,computeIfPresent 方法直接返回 null,不会修改 Map 中的任何内容。

最后,我们输出更新后的 Map 内容,可以看到只有存在且值不为 null 的键值对才会被更新。运行该示例将输出:

Updated Map: {key1=20, key2=40}

computeIfPresent 方法根据指定的函数对 Map存在且值不为 null 的键值对进行了更新或操作。

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

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

相关文章

兰姆顿食尸鬼

弗农弗罗斯特(出生日期不详- 1891年11月13日)&#xff0c;加拿大佃农&#xff0c;杀人犯&#xff0c;被认为是超自然的存在[谁知道?被称为“兰姆顿食尸鬼”。 背景 弗农弗罗斯特在1858年之前的生活细节是未知的&#xff0c;当时他在安大略省兰姆顿县的一个苹果园工作。根据土…

Python实用记录(十六):PyQt/PySide6联动VSCode便捷操作指南

文章目录 一、安装vscode和配置pyside6环境二、安装vscode扩展三、扩展配置编辑四、编辑运行 一、安装vscode和配置pyside6环境 这一步默认已经通过了 二、安装vscode扩展 三、扩展配置编辑 四个地方需要修改&#xff1b;rcc路径、uic路径、designer.exe路径 uic.exe 用于将…

基于Docker + Locust的数据持久化性能测试系统

前几天给大家分享了如何使用Locust进行性能测试&#xff0c;但是在实际使用中会发现存在压测的结果无法保存的问题&#xff0c;比如在分布式部署情况下进行压测&#xff0c;每轮压测完成需要释放资源删除容器重新部署后&#xff0c;这段时间的压测结果就都丢失了&#xff0c;如…

docker-compose docker的批量管理工具

安装 apt-get install docker-compose -y # 查看版本 docker-compose -v设置容器自启动&#xff1a;–restartalways docker run -it -d --restartalways nginx:1.16docker-compose.yml配置文件&#xff0c;该文件的缩进必须是三个空格&#xff0c;使用的是yaml语法。 versi…

Oracle 表分区

1.概述 分区表就是将表在物理存储层面分成多个小的片段&#xff0c;这些片段即称为分区&#xff0c;每个分区保存表的一部分数据&#xff0c;表的分区对上层应用是完全透明的&#xff0c;从应用的角度来看&#xff0c;表在逻辑上依然是一个整体。 目的&#xff1a;提高大表的查…

信息收集。

信息收集 接着使用cs进行信息收集 发现域内管理员账号。 然后查看pc信息&#xff0c; 查看进程。 发现域为god.org 尝试定位域控。 提权 使用cs的功能进行权限提权 成功获取管理员权限。 hash抓取 接着抓hash 成功抓到管理员账号、密码。 接着进行横向传递 成功获取AD和…

React的数据Mock实现

在前后端分类的开发模式下&#xff0c;前端可以在没有实际后端接口的支持下先进行接口数据的模拟&#xff0c;进行正常的业务功能开发 1. 常见的Mock方式 2. json-server实现Mock 实现步骤&#xff1a; 项目中安装json-server npm i -D json-server准备一个json文件 {"…

vue中如何正确使用异步async和await

async 是异步的意思&#xff0c;而 await 是等待的意思&#xff0c;await 用于等待一个异步任务执行完成的结果。 1.async/await 是一种编写异步代码的新方法&#xff08;以前是采用回调和 promise&#xff09;。 2. async/await 是建立在 promise 的基础上。 3. async/await 像…

计算机毕业设计python基于django框架的网上拍卖系统

创新点&#xff1a;本系统采用英国式拍卖和荷兰式拍卖两种模式&#xff0c;英国式拍卖也叫升价拍卖。这是最普遍的一种拍卖方式。拍卖人设定一个底价&#xff0c;竞买人相继给出更高的价格&#xff0c;最终出价最高者胜出&#xff0c;并支付最高价。这种形式在电影中非常常见&a…

PHP源码_新ui潮乎盲盒_h5源码

运行截图 源码贡献 https://githubs.xyz/boot?app40 数据库部份表 -- -- 表的结构 la_box_mark --CREATE TABLE la_box_mark (id int(10) UNSIGNED NOT NULL,icon varchar(191) COLLATE utf8_unicode_ci DEFAULT ,bg_thumb varchar(191) COLLATE utf8_unicode_ci DEFAULT N…

react props传参

props是父子传参的常用方法。 一、主要功能 1.传参 定义&#xff1a;父级组件向子级组件传递参数。 2.验证数据类型格式 定义&#xff1a;可以指定父组件传递过来数据为指定类型。 3.设置默认值 定义&#xff1a;在参数未使用时&#xff0c;直接默认为指定值。 二、实例代…

c++详解栈和队列——及模拟实现stack——queue——例题

初来乍到&#xff0c;望大家点点赞&#xff0c;点点关注&#xff0c;谢谢各位看官老爷 个人主页 在c语言中我们已经模拟实现过栈和队列了&#xff0c;对其底层结构有了基本的认识 栈和队列的详讲 文章目录 目录 文章目录 前言 一、了解栈和队列是什么&#xff1f; ​编辑​编辑…

【信号与系统杂谈 - 1】为什么拉普拉斯变换有收敛域而傅里叶变换没有

这个问题是我在推导傅里叶变换的时移特性公式和拉普拉斯变换的延时特性公式时发现的&#xff08;即拉氏变换总是需要考虑收敛域的原因&#xff09; 援引知乎上的回答解释

人工智能论文:GPT, GPT-2, GPT-3 对比和演进的思路

2018.6 GPT&#xff1a; Improving Language Understanding by Generative Pre-Training 第一篇主要强调 无监督预训练有监督微调transformer 主要成果&#xff1a; 1&#xff0c;无监督预训练&#xff1a;使得模型能够从海量未标记数据中自主学习&#xff0c;为后续任务提供了…

(免费人工智能机器人、周报通、AI中文站、choose-car、智造喵)分享好用的ChatGPT

目录 1、ChatGPTer - 免费人工智能机器人 2、周报通 3、 AI中文站 - chat.7jm.cn 人工智能,稳定高效

(暗虫AI、一站式、酷盖、智言智语、靠谱AI)分享好用的ChatGPT

目录 1、暗虫AI 2、GPT中文站 - 一站式AI解决方案 3、酷盖AI实验室

【Linux系统编程】第十一弹---编辑器vim使用

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、vim的基本概念 2、vim的基本操作 3、vim插入模式命令集 4、vim正常(命令)模式命令集 5、vim末行模式命令集 6、vim操作…

支持向量机回归(概念+实例)

目录 前言 一、基本概念 1. 支持向量机回归的原理 2. 支持向量机回归的工作方式 3. 支持向量机回归的优缺点 4. 支持向量机回归的应用 二、实例 前言 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种强大的机器学习算法&#xff0c;最初…

安装 MySQL 数据库服务器

安装 MySQL 数据库服务器 MySQL 是一种流行的开源关系型数据库管理系统&#xff0c;提供了稳定、高性能的数据库解决方案。下面将介绍在 Windows、Linux 和 macOS 上安装 MySQL 数据库服务器的步骤。 在 Windows 上安装 MySQL 下载 MySQL 安装包&#xff1a;从 MySQL 官方网站…

数据结构与算法(Java版) | 详解十大经典排序算法之一:插入排序

接下来&#xff0c;我来给大家讲解第三种排序算法&#xff0c;即插入排序。 基本介绍 首先&#xff0c;我们来看下插入排序的基本介绍。 插入排序&#xff0c;其属内部排序法&#xff0c;是对于欲排序的元素以插入的方式来找寻该元素的适当位置&#xff0c;以便最终达到排序…