Java中Map的merge、compute、computeIfAbsent、computeIfPresent的用法以及使用场景(一)

本文主要是介绍Java中Map的merge、compute、computeIfAbsent、computeIfPresent的用法以及使用场景(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文由黑壳博客转发

本文来源Java中Map的merge、compute、computeIfAbsent、computeIfPresent的用法以及使用场景(一)

一篇一笑

正文

Java中Map的merge、compute、computeIfAbsent、computeIfPresent的用法以及使用场景(一)
merge,computeIfAbsent使用场景
merge的用法
merge :default V merge(K key, V value,BiFunction<? super V, ? super V, ? extends V> remappingFunction)

merge 的方法有三个参数 第一个是所选map的key,第二个是需要合并的值,第三个是 如何合并,也就是说合并方法的具体实现。

之前的实现
现在我们要做一个操作,把list中的对象,按照属性男女分组,然后把年龄汇总。如果是1.8之前的实现。

    /**  * @author xbmeng  */  public static void main(String[] args) {  //学生的集合  List<Student> students = new ArrayList<>();  students.add(new Student("张三","男",18));  students.add(new Student("李四","男",20));  students.add(new Student("韩梅梅","女",18));  students.add(new Student("小红","女",45));  //声明接收结果的 map  Map<String, Integer> resultMap = new HashMap<>();  for (Student student : students) {  Integer age = resultMap.get(student.getSex());  if(age != null){  resultMap.put(student.getSex(),student.getAge()+age);  }else {  resultMap.put(student.getSex(),student.getAge());  }  }  printResult(resultMap);  }  private static void printResult(Map<String, Integer> map){  for (Map.Entry<String, Integer> e : map.entrySet()) {  System.out.println("key:"+e.getKey()+"   "+"value:"+e.getValue());  }  } 

结果: 
key:女 value:63 
key:男 value:38

1.8中的实现
现在我们要做一个操作,把list中的对象,按照属性男女分组,然后把年龄汇总。如果是1.8之前的实现。

/**  * @author xbmeng  */  public static void main(String[] args) {  //学生的集合  List<Student> students = new ArrayList<>();  students.add(new Student("张三","男",18));  students.add(new Student("李四","男",20));  students.add(new Student("韩梅梅","女",18));  students.add(new Student("小红","女",45));  //声明接收结果的 map  Map<String, Integer> resultMap = new HashMap<>();  for (Student student : students) {  resultMap.merge(student.getSex(), student.getAge(), (a, b) -> b + a);  }  printResult(resultMap);  }  private static void printResult(Map<String, Integer> map){  for (Map.Entry<String, Integer> e : map.entrySet()) {  System.out.println("key:"+e.getKey()+"   "+"value:"+e.getValue());  }  }  

结果: 
key:女 value:63 
key:男 value:38

computeIfAbsent的用法,map缓冲区
merge :computeIfAbsent(K key, 
Function《? super K, ? extends V> mappingFunction)

merge 的方法有两个参数 第一个是所选map的key,第二个是需要做的操作。这个方法当key值不存在时才起作用。

之前的实现
情景:按照男女分组。

    /**  * @author xbmeng  */  public static void main(String[] args) {  //学生的集合  List<Student> students = new ArrayList<>();  students.add(new Student("张三","男",18));  students.add(new Student("李四","男",20));  students.add(new Student("韩梅梅","女",18));  students.add(new Student("小红","女",45));  //声明接收结果的 map  Map<String, List<Student>> resultMap = new HashMap<>();  for (Student student : students) {  List<Student> s = resultMap.get(student.getSex());  if(null == s){  s = new ArrayList<>();  resultMap.put(student.getSex(),s);  }  s.add(student);  }  System.out.println(resultMap);  }  

结果: 
{女=[Student{name=’韩梅梅’, sex=’女’, age=18}, Student{name=’小红’, sex=’女’, age=45}], 男=[Student{name=’张三’, sex=’男’, age=18}, Student{name=’李四’, sex=’男’, age=20}]}

1.8中的实现
情景:按照男女分组。

   /**  * @author xbmeng  */  public static void main(String[] args) {  //学生的集合  List<Student> students = new ArrayList<>();  students.add(new Student("张三","男",18));  students.add(new Student("李四","男",20));  students.add(new Student("韩梅梅","女",18));  students.add(new Student("小红","女",45));  //声明接收结果的 map  Map<String, List<Student>> resultMap = new HashMap<>();  for (Student student : students) {  List<Student> s = resultMap.computeIfAbsent(student.getSex(), k -> new ArrayList<>());  s.add(student);  }  System.out.println(resultMap);  }  

结果: 
{女=[Student{name=’韩梅梅’, sex=’女’, age=18}, Student{name=’小红’, sex=’女’, age=45}], 男=[Student{name=’张三’, sex=’男’, age=18}, Student{name=’李四’, sex=’男’, age=20}]}

compute,computeIfPresent 下一篇博客。

About

欢迎在评论写下你的程序员趣事~~

欢迎加入我们的小组织 ,大家都叫壳叔,期待你的到来。

欢迎关注公众号

微信公众号

这是我们的Group

黑壳家根据地 Q群:200408242

这篇关于Java中Map的merge、compute、computeIfAbsent、computeIfPresent的用法以及使用场景(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/447855

相关文章

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll