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

目录

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3 第四节 自定义hook函数以及组合式API

1.自定义hook函数 2.toRef和toRefs 3.shallowRef和shallowReactive 4.readonly和shallowReadonly 5.toRaw和markRaw 6.customref 一.自定义hook函数 ① 本质是一个函数&#xff0c;把setup函数中使用的Composition API 进行了封装,类似于vue2.x中的mixin 自定义hook函数…

从MySQL到金蝶云星空通过接口配置打通数据

从MySQL到金蝶云星空通过接口配置打通数据 对接系统&#xff1a;MySQL MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQLAB公司开发&#xff0c;属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一&#xff0c;在WEB应用方面&#xff0c;MySQL是最好的RDBMS…

HCIP 链路聚合技术

1、链路聚合概述 为了保证网络的稳定性&#xff0c;仅仅是设备进行备份还不够&#xff0c;我们需要针对我们的链路进行备份&#xff0c;同时也增加了链路的利用率&#xff0c;提高带宽。避免一条链路出现故障&#xff0c;导致网络无法正常通信。这就可以使用链路聚合技术。 以…

Uniapp使用腾讯地图并进行标点创建和设置保姆教程

使用Uniapp内置地图 首先我们需要创建一个uniapp项目 首先我们需要创建一个uniapp项目 我们在HBuilder左上角点击文件新建创建一个项目 然后下面这张图的话就是uniapp创建项目过程当中需要注意的一些点和具体的操作 然后我们创建完项目之后进入到项目pages文件夹下&#xff…

AP51656 电流采样降压恒流驱动IC RGB PWM深度调光 LED电源驱动

产品描述 AP51656是一款连续电感电流导通模式的降压恒流源&#xff0c;用于驱动一颗或多颗串联LED 输入电压范围从 5 V 到 60V&#xff0c;输出电流 可达 1.5A 。根据不同的输入电压和 外部器件&#xff0c; 可以驱动高达数十瓦的 LED。 内置功率开关&#xff0c;采用电流采样…

Redis——常见数据结构与单线程模型

Redis中的数据结构 Redis中所有的数据都是基于key&#xff0c;value实现的&#xff0c;这里的数据结构指的是value有不同的类型。 当前版本Redis支持10种数据类型&#xff0c;下面介绍常用的五种数据类型 底层编码 Redis在实现上述数据结构时&#xff0c;会在源码有特定的…

成像镜头均匀性校正——360°超广角均匀校准光源

随着空间技术的不断发展&#xff0c;遥感仪器在对地观测、大气探测及海洋探测等方面的应用也不断拓展&#xff0c;以实现不同任务的观测精度。空间遥感仪器热控技术旨在保证遥感器各部件所需温度水平、温度梯度和温度稳定度&#xff0c;以满足遥感器高质量成像要求。 近年来我国…

动手学DL——MLP多层感知机【深度学习】【PyTorch】

文章目录 4、多层感知机&#xff08; MLP&#xff09;4.1、多层感知机4.1.1、隐层4.1.2、激活函数 σ 4.2、从零实现多层感知机4.3、简单实现多层感知机4.4、模型选择、欠拟合、过拟合4.5、权重衰退4.6、丢失法|暂退法&#xff08;Dropout&#xff09;4.6.1、dropout 函数实现4…

策略模式实战应用

场景 假设做了个卖课网站&#xff0c;会员等级分为月vip、年vip、终生vip&#xff0c;每个等级买课的优惠力度不一样&#xff0c;传统的写法肯定是一堆的 if-else&#xff0c;现在使用策略模式写出代码实现 代码实现 策略模式的核心思想就是对扩展开放&#xff0c;对修改关闭…

C# Linq源码分析之Take方法

概要 Take方法作为IEnumerable的扩展方法&#xff0c;具体对应两个重载方法。本文主要分析第一个接收整数参数的重载方法。 源码解析 Take方法的基本定义 public static System.Collections.Generic.IEnumerable Take (this System.Collections.Generic.IEnumerable source…

2023杭电多校第8场E题-0 vs 1

题目链接&#xff1a;http://csoj.scnu.edu.cn/contest/102/problem/1005 解题思路&#xff1a; 代码如下&#xff1a; #include<iostream> #include<math.h> #include<algorithm> using namespace std; const int N 1e5 10;int s[N], l, r; int now;int…

c++11 标准模板(STL)(std::basic_fstream)(五)

定义于头文件 <fstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_fstream : public std::basic_iostream<CharT, Traits> 类模板 basic_fstream 实现基于文件的流上的高层输入/输出。它将 std::basic_i…

【Vue】使用print.js插件实现打印预览功能,超简单

目录 一、实现效果 二、实现步骤 【1】安装插件 【2】在需要打印的页面导入 【3】在vue文件中需要打印的部分外层套一层div&#xff0c;给div设置id。作为打印的区域 【4】在打印按钮上添加打印事件 【5】在methods中添加点击事件 三、完整代码 一、实现效果 二、实现步…

【非欧几里得域信号的信号处理】使用经典信号处理和图信号处理在一维和二维欧几里得域信号上应用低通滤波器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Spring与Spring Bean

Spring 原理 它是一个全面的、企业应用开发一站式的解决方案&#xff0c;贯穿表现层、业务层、持久层。但是 Spring 仍然可 以和其他的框架无缝整合。 Spring 特点 轻量级 控制反转 面向切面 容器 框架集合 Spring 核心组件 Spring 总共有十几个组件核心容器(Spring core) S…

RN 使用react-navigation写可以滚动的横向导航条(expo项目)

装包&#xff1a; yarn add react-navigation/material-top-tabs react-native-tab-view npx expo install react-native-pager-view import React from react import { View, Text, ScrollView, SafeAreaView } from react-native import { Icon } from ../../../../../compo…

python编辑器安装与配置,python用哪个编辑器好用

大家好&#xff0c;给大家分享一下python编辑器pycharm安装教程&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 哪些python的编程软件值得推荐&#xff1f; 编写python源代码的软件.首推的Pycharm。 PyCharm用于bai一般IDE具备的功能&…

Redis的安装方法与基本操作

目录 前言 一、REDIS概述 二、REDIS安装 1、编译安装 2.yum安装 三、Redis的目录结构 四、基础命令解析 五、在一台服务器上启动多个redis 六、数据库的基本操作 &#xff08;一&#xff09;登录数据库 &#xff08;二&#xff09;基础命令 七、Redis持久化 &#xff08;一&…

每天一个知识点——Normalization

这里结合大模型的学习&#xff0c;主要分析Layer Norm、RMS Norm和Deep Norm的异同&#xff0c;与此同时&#xff0c;究竟是在之前执行Normalization&#xff08;Pre-Norm&#xff09;还是之后执行&#xff08;Post-Norm&#xff09;&#xff0c;也是一个比较喜欢拿来讨论的知识…

ChatGPT会取代搜索引擎吗?BingChat、GoogleBard与ChatGPT区别

目前暂时不会&#xff0c;ChatGPT为代表的聊天机器人很可能会直接集成到搜索中&#xff0c;而不是取代它。微软已经通过Bing Chat和Bing做到了这一点&#xff0c;它将“聊天”选项卡直接放入Bing搜索的菜单中。Google、百度也分别开始尝试通过其AI生成技术将Google Bard、文心一…