IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> Java8 Map的compute、computeIfPresent、computeIfAbsent区别以及使用场景 -> 正文阅读

[开发工具]Java8 Map的compute、computeIfPresent、computeIfAbsent区别以及使用场景

介绍

以测试用例方式来展示Map的compute()、computeIfPresent()、computeIfAbsent()这三个方法的区别

结论

compute方法=computeIfPresent方法 + computeIfAbsent方法

一、compute(参数一、参数二)方法:

参数一:指定的key
参数二:接口函数(k,v)
结论:
(修改数据) 原始Map指定的key值存在,函数接口返回不会空,则用接口函数返回的结果替换key的value
(删除数据) 原始Map指定的key值存在,函数接口返回为空,删除key对应的数据
(添加数据) 原始Map指定的key值不存在,函数接口返回为不空,则添加一条数据到Map,key:指定的key value:函数返回的结果

二、computeIfPresent(参数一、参数二)

参数一:指定的key
参数二:接口函数(k,v)
结论:
(修改数据) 原始Map指定的key值存在,函数接口返回不会空,则用接口函数返回的结果替换key的value
(删除数据) 原始Map指定的key值存在,函数接口返回为空,删除key对应的数据

三、computeIfAbsent(参数一、参数二)

参数一:指定的key
参数二:接口函数(k)
结论:
(添加数据) 原始Map指定的key值不存在,函数接口返回为不空,则添加一条数据到Map,key:指定的key value:函数返回的结果

测试用例展示

完整代码:地址
为了代码简介,先写一个打印日志的方法:printLogAndReturnParam

/**
   * 打印前两个参数,返回第三参数
   *
   * @param k
   * @param v
   * @param result
   * @return
   */
  public static String printLogAndReturnParam(String k, String v, String result) {
    System.out.print("k-" + k + " ");
    System.out.println("v-" + v);
    return result;
  }

测试用例一、compute方法

测试代码
public void testMapCompute() {
    Map<String, String> map = new LinkedHashMap<>();
    System.out.println("测试场景:compute");
    map.put("k1", "v1");
    map.put("k2", "v2");
    map.put("k3", "v3");
    System.out.print("测试指定key存在,返回值一致:");
    map.compute("k1", (k, v) -> printLogAndReturnParam(k, v, "v1"));
    System.out.print("测试指定key存在,返回值不一致:");
    map.compute("k2", (k, v) -> printLogAndReturnParam(k, v, "VV2"));
    System.out.print("测试指定key存在,返回值为NULL:");
    map.compute("k3", (k, v) -> printLogAndReturnParam(k, v, null));
    System.out.print("测试指定key不存在,返回值NULL:");
    map.compute("k4", (k, v) -> printLogAndReturnParam(k, v, null));
    System.out.print("测试指定key不存在,返回值不为NULL:");
    map.compute("k5", (k, v) -> printLogAndReturnParam(k, v, "VV5"));
    System.out.print("输出结果:" + map);
    System.out.println("结论如下:");
    System.out.println("测试指定key存在,返回值一致:value保持不变");
    System.out.println("测试指定key存在,返回值不一致:value使用返回值");
    System.out.println("测试指定key存在,返回值为NULL:删除该条数据");
    System.out.println("测试指定key不存在,返回值NULL:不添加不删除");
    System.out.println("测试指定key不存在,返回值不为NULL:添加数据,key:指定的key,value:返回值");
  }
日志输出

测试场景:compute
测试指定key存在,返回值一致:k-k1 v-v1
测试指定key存在,返回值不一致:k-k2 v-v2
测试指定key存在,返回值为NULL:k-k3 v-v3
测试指定key不存在,返回值NULL:k-k4 v-null
测试指定key不存在,返回值不为NULL:k-k5 v-null
输出结果:{k1=v1, k2=VV2, k5=VV5}结论如下:
测试指定key存在,返回值一致:value保持不变
测试指定key存在,返回值不一致:value使用返回值
测试指定key存在,返回值为NULL:删除该条数据
测试指定key不存在,返回值NULL:不添加不删除
测试指定key不存在,返回值不为NULL:添加数据,key:指定的key,value:返回值

测试用例二、computeIfPresent方法

测试代码
public void testMapComputeIfPresent() {
    Map<String, String> map = new LinkedHashMap<>();
    System.out.println("测试场景:computeIfPresent");
    map.put("k1", "v1");
    map.put("k2", "v2");
    map.put("k3", "v3");
    System.out.print("测试指定key存在,返回值一致:");
    map.computeIfPresent("k1", (k, v) -> printLogAndReturnParam(k, v, "v1"));
    System.out.print("测试指定key存在,返回值不一致:");
    map.computeIfPresent("k2", (k, v) -> printLogAndReturnParam(k, v, "VV2"));
    System.out.print("测试指定key存在,返回值为NULL:");
    map.computeIfPresent("k3", (k, v) -> printLogAndReturnParam(k, v, null));
    System.out.println("测试指定key不存在,返回值NULL:");
    map.computeIfPresent("k4", (k, v) -> printLogAndReturnParam(k, v, null));
    System.out.println("测试指定key不存在,返回值不为NULL:");
    map.computeIfPresent("k5", (k, v) -> printLogAndReturnParam(k, v, "VV5"));
    System.out.print("输出结果:" + map);
    System.out.println("结论如下:");
    System.out.println("测试指定key存在,返回值一致:value保持不变");
    System.out.println("测试指定key存在,返回值不一致:value使用返回值");
    System.out.println("测试指定key存在,返回值为NULL:删除该条数据");
    System.out.println("测试指定key不存在,返回值NULL:不添加不删除");
    System.out.println("测试指定key不存在,返回值不为NULL:不添加不删除");
  }
日志输出

测试场景:computeIfPresent
测试指定key存在,返回值一致:k-k1 v-v1
测试指定key存在,返回值不一致:k-k2 v-v2
测试指定key存在,返回值为NULL:k-k3 v-v3
测试指定key不存在,返回值NULL:
测试指定key不存在,返回值不为NULL:
输出结果:{k1=v1, k2=VV2}结论如下:
测试指定key存在,返回值一致:value保持不变
测试指定key存在,返回值不一致:value使用返回值
测试指定key存在,返回值为NULL:删除该条数据
测试指定key不存在,返回值NULL:不添加不删除
测试指定key不存在,返回值不为NULL:不添加不删除

测试用例三、computeIfAbsent方法

测试代码
public void testMapComputeIfAbsent() {
    Map<String, String> map = new LinkedHashMap<>();
    System.out.println("测试场景:computeIfAbsent");
    map.put("k1", "v1");
    map.put("k2", "v2");
    map.put("k3", "v3");
    System.out.println("测试指定key1存在,返回值一致");
    map.computeIfAbsent("k1", k -> "v1");
    System.out.println("测试指定key2存在,返回值不一致");
    map.computeIfAbsent("k2", k -> "VV2");
    System.out.println("测试指定key3存在,返回值为NULL");
    map.computeIfAbsent("k3", k -> null);
    System.out.println("测试指定key4不存在,返回值NULL");
    map.computeIfAbsent("k4", k -> null);
    System.out.println("测试指定key5不存在,返回值不为NULL");
    map.computeIfAbsent("k5", k -> "VV5");
    System.out.print("输出结果:" + map);
    System.out.println("结论如下:");
    System.out.println("测试指定key存在,返回值一致:不添加不删除");
    System.out.println("测试指定key存在,返回值不一致:不添加不删除");
    System.out.println("测试指定key存在,返回值为NULL:不添加不删除");
    System.out.println("测试指定key不存在,返回值NULL:不添加不删除");
    System.out.println("测试指定key不存在,返回值不为NULL:添加数据,key:指定的key,value:指定的value");
  }
日志输出

测试场景:computeIfAbsent
测试指定key1存在,返回值一致
测试指定key2存在,返回值不一致
测试指定key3存在,返回值为NULL
测试指定key4不存在,返回值NULL
测试指定key5不存在,返回值不为NULL
输出结果:{k1=v1, k2=v2, k3=v3, k5=VV5}结论如下:
测试指定key存在,返回值一致:不添加不删除
测试指定key存在,返回值不一致:不添加不删除
测试指定key存在,返回值为NULL:不添加不删除
测试指定key不存在,返回值NULL:不添加不删除
测试指定key不存在,返回值不为NULL:添加数据,key:指定的key,value:指定的value

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-05-18 17:51:32  更:2022-05-18 17:53:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:57:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码