时间:2021-05-19
1. 介绍
本入门教程将介绍Java8中如何合并两个map。
更具体说来,我们将研究不同的合并方案,包括Map含有重复元素的情况。
2. 初始化
我们定义两个map实例
Employee类
然后往map中存入一些数据
特别需要注意的是employee1 和 employee5在map中有完全相同的key(name)。
3. Map.merge()
Java8为 java.util.Map接口新增了merge()函数。
merge() 函数的作用是: 如果给定的key之前没设置value 或者value为null, 则将给定的value关联到这个key上.
否则,通过给定的remaping函数计算的结果来替换其value。如果remapping函数的计算结果为null,将解除此结果。
First, let's construct a new HashMap by copying all the entries from the map1:
首先,我们通过拷贝map1中的元素来构造一个新的HashMap
然后引入merge函数和合并规则
最后对map2进行迭代将其元素合并到map3中
运行程序并打印结果如下:
John=Employee{id=8, name='John'}
Annie=Employee{id=22, name='Annie'}
George=Employee{id=2, name='George'}
Henry=Employee{id=1, name='Henry'}
最终,通过结果可以看出,实现了两个map的合并,对重复的key也合并为同一个元素。
注意最后一个Employee的id来自map1而name来自map2.
原因是我们的merge函数的定义
4. Stream.concat()
Java8的Stream API 也为解决该问题提供了较好的解决方案。
首先需要将两个map合为一个Stream。
我们需要将entry sets作为参数,然后利用Collectors.toMap():将结果放到新的map中。
该方法可以实现map的合并,但是有重复key会报IllegalStateException异常。
为了解决这个问题,我们需要加入lambda表达式merger作为第三个参数
当检测到有重复Key时就会用到该lambda表达式。
现在把上面代码组合在一起:
最终的结果
George=Employee{id=2, name='George'}
John=Employee{id=8, name='John'}
Annie=Employee{id=22, name='Annie'}
Henry=Employee{id=3, name='Henry'}
从结果可以看出重复的key “Henry”将合并为一个新的键值对,id取自map2,name取自map1。
5. Stream.of()
通过Stream.of()方法不需要借助其他stream就可以实现map的合并。
首先将map1和map2的元素合并为同一个流,然后再转成map。通过使用v1的id和v2的name来解决重复key的问题。
map3的运行打印结果如下:
6. Simple Streaming
我们还可以借助stream的管道操作来实现map合并。
结果如下:
{John=Employee{id=8, name='John'},
Annie=Employee{id=22, name='Annie'},
George=Employee{id=2, name='George'},
Henry=Employee{id=1, name='Henry'}}
7. StreamEx
我们还可以使Stream API 的增强库
注意 (e1, e2) -> e1 表达式来处理重复key的问题,如果没有该表达式依然会报IllegalStateException异常。
结果:
{George=Employee{id=2, name='George'},
John=Employee{id=8, name='John'},
Annie=Employee{id=22, name='Annie'},
Henry=Employee{id=1, name='Henry'}}
8 总结
本文使用了Map.merge(), Stream API, StreamEx 库实现map的合并。
英文原文地址:https:///java-merge-maps
到此这篇关于详解Java8合并两个Map中元素的正确姿势的文章就介绍到这了,更多相关Java8合并Map中元素内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
在java开发中,我们经常会遇到需要从一个集合中,抽取集合中元素的某一个属性。在java8之前,我们通常采用for循环去获取,但java8之后我们有了一种新的办
1.前言Java8提供了非常好用的StreamAPI,可以很方便的操作集合。今天我们来探讨两个Stream中间操作map(Functionmapper)和fla
简介Map是java中非常常用的一个集合类型,我们通常也需要去遍历Map去获取某些值,java8引入了Stream的概念,那么我们怎么在Map中使用Stream
本文实例讲述了Java8新增的重复注解功能。分享给大家供大家参考,具体如下:一点睛在Java8以前,同一个程序元素前最多只能使用一个相同类型的Annotatio
本文实例分析了Java接口默认方法带来的问题。分享给大家供大家参考,具体如下:一点睛Java8中,如果一个类实现两个或多个接口,即“变相”的多继承,但是若其中两