Map中compute、putIfAbsent、computeIfAbsent、merge、computeIfPresent使用

news2024/11/25 9:55:05

目录

putIfAbsent

computeIfAbsent

computeIfPresent

compute

merge


putIfAbsent

解释:【不存在则添加】,如果map中没有该key,则直接添加;如果map中已经存在该key,则value保持不变

 default V putIfAbsent(K key, V value) {
  			//  根据key获取value
        V v = get(key);
        // 如果value == null  则将新的value赋值给key 然后返回新的value
        // 否则返回历史value
        if (v == null) {
            v = put(key, value);
        }

        return v;
    }
 Map<String,Integer> map1 = new HashMap<>();
        map1.put("a",1);
        map1.putIfAbsent("a",2);
        map1.forEach((k,v)->{
            System.out.println(k+"->"+v);
        });

输出结果为1

 Map<String,Integer> map1 = new HashMap<>();
        //map1.put("a",1);
        map1.putIfAbsent("a",2);
        map1.forEach((k,v)->{
            System.out.println(k+"->"+v);
        });
输出结果为2

computeIfAbsent

解释:【不存在则计算】,如果map中没有该key,则会计算出一个符合value类型的值赋给value;如果map中已经存在该key,则value保持不变;由于它是Funcation函数接口,因此只能处理一个参数

image.png

public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("a",1);

        map.computeIfAbsent("c",(k)->2);

        map.forEach((k,v)->{
            System.out.println(k+"-->"+v);
        });
    }
输出结果为:
a-->1
c-->2

computeIfPresent

解释:【存在则计算】,如果map中没有该key,则该键值对不会添加到map中;如果map中已经存在该key,则会把计算出的值覆盖原来的value;由于它是BiFuncation函数接口,因此能处理两个参数

image.png

image.png

public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("a", 1);

        map.computeIfPresent("a", (oldK, oldV) -> {
            return oldV+1;
        });

        map.forEach((k, v) -> {
            System.out.println(k + "-->" + v);
        });
    }
输出结果为:
a-->2

    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("a", 1);

        map.computeIfPresent("b", (oldK, oldV) -> {
            return oldV+1;
        });

        map.forEach((k, v) -> {
            System.out.println(k + "-->" + v);
        });
    }
输出结果为:
a-->1

compute

解释:【计算】,如果map中没有该key,则会计算出一个符合value类型的值赋给value;如果map中已经存在该key,则会把计算出的值覆盖原来的value.可以当成是computeIfAbsent与computeIfPresent的结合体;由于它是BiFuncation函数接口,因此能处理两个参数

 public static void main(String[] args) {
        // 存在一个需求 如果map中存在key则将原来key的值进行+10
        // 如果map中不存在key 则将此值赋值为1
        Map<String, Integer> map = new HashMap<>();
        map.put("a", 1);
        if (map.containsKey("b")) {
            map.put("b", map.get("b") + 10);
        } else {
            map.put("b", 1);
        }
        map.forEach((k, v) -> {
            System.out.println(k + "-->" + v);
        });
    }
输出结果:
a-->1
b-->1

// 使用computeIfPresent + computeIfAbsent
 public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("a", 1);
        map.computeIfPresent("b",(k,v)->v+10);
        map.computeIfAbsent("b",(k)->1);
//        if (map.containsKey("b")) {
//            map.put("b", map.get("b") + 10);
//        } else {
//            map.put("b", 1);
//        }
        map.forEach((k, v) -> {
            System.out.println(k + "-->" + v);
        });
    }
输出结果:
a-->1
b-->1


// 使用compute优化
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("a", 1);
//        if (map.containsKey("b")) {
//            map.put("b", map.get("b") + 10);
//        } else {
//            map.put("b", 1);
//        }
        map.compute("b", (oldK, oldV) -> oldV == null ? 1 : oldV + 10);

        map.forEach((k, v) -> {
            System.out.println(k + "-->" + v);
        });
    }
输出结果:
a-->1
b-->1

merge

merge(key, value, remappingFunction)

解释:【合并】如果 key 对应的 value 不存在,则返回该 value 值,如果存在,则返回通过 remappingFunction 重新计算后的值

image.png

public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("a", 1);
//        if (map.containsKey("b")) {
//            map.put("b", map.get("b") + 10);
//        } else {
//            map.put("b", 1);
//        }
        map.merge("b",1, Integer::sum);

        map.forEach((k, v) -> {
            System.out.println(k + "-->" + v);
        });
    }
输出结果:
a-->1
b-->1

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

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

相关文章

Metasploitable2靶机漏洞复现

一、信息收集 nmap扫描靶机信息 二、弱口令 1.系统弱口令 在Kali Linux中使用telnet远程连接靶机 输入账号密码msfadmin即可登录 2.MySQL弱口令 使用mysql -h 靶机IP地址即可连接 3.PostgreSQL弱密码登录 输入psql -h 192.168.110.134 -U postgres 密码为postgres 输入\…

Python中的lambda函数

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! Python中的lambda函数 在Python中&#xff0c;我们使用lambda关键字来声明一个匿名函数&#xff0c; 这就是为什么我们将它们称为“lambda函数”。 匿名函数是指没有声明函数名称的函数。 尽管它们在语法上看起来不同&a…

【MySQL】并发执行事务可能存在的问题, 事物的四种隔离级别

文章目录 前言一、并发执行事务可能存在的问题1, 脏读问题2, 不可重复读3, 幻读 二、MySQL 的四种隔离级别1, READ UNCOMMITTED 读未提交2, READ COMMITTED 读已提交3, REPEATABLE READ 可重复读 (MySQL 的默认事务隔离级别)4, SERIALIZABLE 串行化 总结 前言 各位读者好, 我是…

百度智能云“千帆大模型平台”升级,大模型最多,Prompt模板最全

1、前言 从ChatGPT正式推出之后&#xff0c;大模型开始逐渐火爆起来&#xff0c;基于大模型的潜力与广泛应用前景&#xff0c;多个厂商也开始在大模型领域进行深耕布局。越来越多的人也开始尝试使用大模型来解决日常工作或生活中的问题&#xff0c;有效地提高了处理问题的效率。…

探讨uniapp的生命周期问题

在uniapp中,生命周期函数分为应用生命周期函数、页面生命周期函数和组件生命周期函数. 1应用声明周期 应用生命周期函数只能在 App.vue 中监听有效&#xff0c;在其他页监听无效。 onLaunch&#xff1a;当uni-app 初始化完成时触发&#xff08;全局只触发一次&#xff09;on…

【变形金刚03】使用 Pytorch 开始构建transformer

一、说明 在本教程中&#xff0c;我们将使用 PyTorch 从头开始构建一个基本的转换器模型。Vaswani等人在论文“注意力是你所需要的一切”中引入的Transformer模型是一种深度学习架构&#xff0c;专为序列到序列任务而设计&#xff0c;例如机器翻译和文本摘要。它基于自我注意机…

【传输层】Tcp协议的原理(二)

文章目录 一、TCP协议原理&#xff08;二&#xff09;总结 一、TCP协议原理&#xff08;二&#xff09; 1.解决TIME_WAIT状态引起的bind失败的方法 我们之前实现tcp服务器的时候发现&#xff0c;服务器经常有时候断开可以立即重启&#xff0c;有时候断开必须换端口号才能重新…

qt事件系统源码-----定时器

qt定时器的使用一般有以下几种方式&#xff1a; 1、直接使用QTimer对象&#xff0c;绑定定时器的timeout信号&#xff1b; 2、使用QTimer的静态方法singleshot方法&#xff0c;产生一个一次性的定时事件 3、在QObject子类中&#xff0c;调用startTimer方法&#xff0c;产生定…

Vue.js从入门到精通:软件开发视频大讲堂

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 前言 随着Web应用程序的…

nodejs+vue+elementui+express旅游出行指南网站_655ms

本文主要介绍了一种基于windows平台实现的旅游出行指南。该系统为用户找到景点信息和酒店信息提供了更安全、更高效、更便捷的途径。本系统有两个角色&#xff1a;管理员和用户&#xff0c;要求具备以下功能&#xff1a; &#xff08;1&#xff09;用户可以浏览主页了解旅游出行…

2023牛客暑期多校训练营8-C Clamped Sequence II

2023牛客暑期多校训练营8-C Clamped Sequence II https://ac.nowcoder.com/acm/contest/57362/C 文章目录 2023牛客暑期多校训练营8-C Clamped Sequence II题意解题思路代码 题意 解题思路 先考虑不加紧密度的情况&#xff0c;要支持单点修改&#xff0c;整体查询&#xff0…

阿里云服务器安装AMH面板建站教程

本文阿里云百科分享使用阿里云服务器安装AMH面板建站教程&#xff0c;AMH是一套通过Web控制和管理Linux服务器以及虚拟主机的管理系统。您可以使用云服务器ECS安装AMH来搭建PHP网站。本篇教程分别介绍如何在Linux系统实例中部署AMH并快速搭建PHP网站。 目录 前提条件 手动部…

Electron 应用实现截图并编辑功能

Electron 应用实现截图并编辑功能 Electron 应用如何实现截屏功能&#xff0c;有两种思路&#xff0c;作为一个框架是否可以通过框架实现截屏&#xff0c;另一种就是 javaScript 结合 html 中画布功能实现截屏。 在初步思考之后&#xff0c;本文优先探索使用 Electron 实现截屏…

CCF-CSP 29次 第三题【202303-3 LDAP】(多个STL+递归)

计算机软件能力认证考试系统 #include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <unordered_map> #include <string>using namespace std;typedef long long LL;const int N 2510, M 510;int n…

Qt应用开发(基础篇)——拆分器窗口 QSplitter QSplitterHandle

一、前言 QSplitter继承于QFrame&#xff0c;QFrame继承于QWidget&#xff0c;是Qt的一个部件容器工具类。 框架类QFrame介绍 QSplitter拆分器&#xff0c;用户通过拖动子部件之间的边界来控制子部件的大小&#xff0c;在应用开发中数据分模块展示、图片展示等场景下使用。 二、…

Nuxt.js--》解锁 Nuxt 项目的潜力:从配置开始,迈向成功

博主今天开设Nuxt.js专栏&#xff0c;带您深入探索 Nuxt.js 的精髓&#xff0c;学习如何利用其强大功能构建出色的前端应用程序。我们将探讨其核心特点、灵活的路由系统、优化技巧以及常见问题的解决方案。无论您是想了解 Nuxt.js 的基础知识&#xff0c;还是希望掌握进阶技巧&…

FastDFS安装教程

FastDFS安装 软件下载 需要的软件&#xff1a;fastdfs-6.0.4、libfastcommon-1.0.42、fastdfs-nginx-module-1.22.tar.gz 下载地址 安装 fastdfs是使用c语言写的&#xff0c;需要先配置c语言环境。 yum install -y gcc gcc-cyum install libevent安装libfastcommon函数库…

Leetcode-每日一题【剑指 Offer 20. 表示数值的字符串】

题目 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。 数值&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 若干空格一个 小数 或者 整数&#xff08;可选&#xff09;一个 e 或 E &#xff0c;后面跟着一个 整数若干空…

Win7累积补丁更新包_UpdatePack7R2-23.8.10

UpdatePack7是最新的Win7补丁累积更新包&#xff0c;Windows 7更新补丁安装包&#xff0c;Win7累积更新离线安装包包括所有关键更新和安全更新及Internet Explorer所有版本的更新&#xff0c;此外还集成了NVMe驱动和USB3.0驱动&#xff0c;使用它还可以将累积更新封装到系统内&…

通过BitMap实现签到

针对黑马点评。 bitmap签到 在传统的签到系统中的数据库的表一般都采取直接存储的形式&#xff0c;类似于一种记录表&#xff0c;但是如果用户的数量特别大&#xff0c;签到上几个月之后&#xff0c;这种表的数据量特别大&#xff0c;同时&#xff0c;存储的数据也会占用很多…