作者:lqwood\链接:https://juejin.cn/post/684490...Java8最大的特点无异于更加面向函数,比如lambda的引入等,可以更好的实现函数式编程。前段时间无意中发现了map.merge()这个方法,感觉很好用。本文简要介绍一些相关信息。首先让我们看一个例子。合并()如何工作?假设我们有这么一段业务逻辑,我有一个学生成绩对象列表,对象包含三个属性:学生姓名、科目、科目分数,需要获取每个学生的总成绩。加入列表如下:privateListbuildATestList(){ListstudentScoreList=newArrayList<>();StudentScorestudentScore1=newStudentScore(){{setStuName("张三");setSubject("中文");设置分数(70);}};StudentScorestudentScore2=newStudentScore(){{setStuName("张三");setSubject("数学");设置分数(80);}};StudentScorestudentScore3=newStudentScore(){{setStuName("张三");setSubject("英语");设置分数(65);}};StudentScorestudentScore4=newStudentScore(){{setStuName("李四");setSubject("中文");设置分数(68);}};StudentScorestudentScore5=newStudentScore(){{setStuName("李四");setSubject("数学");设置分数(70);}};StudentScorestudentScore6=newStudentScore(){{setStuNa我("李四");setSubject("英语");设置分数(90);}};StudentScorestudentScore7=newStudentScore(){{setStuName("王五");setSubject("语文");设置分数(80);}};StudentScorestudentScore8=newStudentScore(){{setStuName("王五");setSubject("数学");设置分数(85);}};StudentScorestudentScore9=newStudentScore(){{setStuName("王五");setSubject("英语");设置分数(70);}};studentScoreList.add(studentScore1);studentScoreList.add(studentScore2);studentScoreList.add(studentScore3);studentScoreList.add(studentScore4);studentScoreList.add(studentScore5);studentScoreList.add(studentScore6);studentScoreList.add(studentScore7);studentScoreList.add(studentScore8);studentScoreList.add(studentScore9);returnstudentScoreList;}我们先看下常规做法:ObjectMapperobjectMapper=newObjectMapper();ListstudentScoreList=buildATestList();MapstudentScoreMap=newHashMap<>();studentScoreList.forEach(studentScore->{if(studentScoreMap.containsKey(studentScore.getStuName())){studentScoreMap.put(studentScore.getStuName(),studentScoreMap.get(studentScore.getStuName())+studentScore.getScore());}else{studentScoreMap.put(studentScore.getStuName(),studentScore.getScore());}});System.out.println(objectMapper.writeValueAsString(studentScoreMap));//结果如下://{"李四":228,"张三":215,"王五":235}然后再看一下merge()是怎么做的:MapstudentScoreMap2=newHashMap<>();studentScoreList.forEach(studentScore->studentScoreMap2.merge(studentScore.getStuName(),studentScore.getScore(),Integer::sum));System.out.println(objectMapper.writeValueAsString(studentScoreMap2));//结果如下://{"李四":228,"张三":215,"王五":235}如果不存在)或者更新给定键值对应的值。源码如下:defaultVmerge(Kkey,Vvalue,BiFunctionremappingFunction){Objects.requireNonNull(remappingFunction);对象.requireNonNull(值);VoldValue=this.get(key);V新值=旧值==空值?值:remappingFunction.apply(oldValue,value);if(newValue==null){this.remove(key);}else{this.put(key,newValue);}returnnewValue;}我们可以看到原理也很简单,这个方法接收三个参数,一个key值,一个value,一个remappingFunction,如果给定的key不存在,就变成put(key,value)但是,如果键已经有一些值,我们的remappingFunction可以选择合并方法,然后将合并后的新值分配给原始键。使用场景使用场景比较多,比如分组、求和等操作。虽然stream中有相关的groupingBy()方法,但是如果你想在循环中做一些其他的操作,merge()仍然是一个相当不错的选择。除了merge()方法,我还看到了Java8中其他一些和map相关的方法,比如putIfAbsent、compute()、computeIfAbsent()、computeIfPresent,这些方法看名字就应该知道是什么意思了,所以有兴趣的可以直接看下源码(还是比较容易理解的),这里贴出compute()(Map.class)的源码,它的返回值就是计算后得到的新值。值:默认Vcompute(Kkey,BiFunctionremappingFunction){Objects.requireNonNull(remappingFunction);VoldValue=this.get(key);VnewValue=remappingFunction.apply(key,oldValue);if(newValue==null){if(oldValue==null&&!this.containsKey(key)){返回null;}else{this.remove(key);返回空值;}}else{这个.put(key,newValue);返回新值;}}小结本文简单介绍了Map.merge()的方法。另外,Java8中HashMap的实现方式使用了TreeNode和红黑树。看源码可能有点难度,但是原理差不多,compute()也是一样。因此,必须阅读源代码。不懂的多看多练就会明白了。近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!