Java中比较两个Map并获取键值差异的最佳实现方式
问题场景
现有两个定义如下的Map实例:
Map<Long, Apple> map1; Map<Long, Apple> map2;
其中Apple类已重写equals方法,可直接通过map1.equals(map2)判断两个Map是否相等。当该判断返回false(即两个Map不相等)时,需要获取二者的具体差异。
常见的Map差异分为两类:
- 两个Map的键集合存在差异:即其中一个Map包含另一个Map不存在的键
- 公共键对应的值存在差异:即某个键在两个Map中都存在,但对应的value不相等
最佳解决方案
不推荐手写循环遍历键集做差异比对,这类手写逻辑很容易遗漏边界场景,甚至出现和Map.equals()判断标准不一致的问题。
最佳实现是使用Guava库提供的com.google.common.collect.MapDifference工具类,无需额外编写冗余逻辑,就可以同时识别键、值两个维度的Map差异,且判断逻辑和Map.equals()完全对齐,基于元素自身的equals方法做相等判定。
使用方式非常简单:
- 调用
Maps.difference(map1, map2)获取两个Map对应的差异实例 - 调用差异实例的内置方法,即可直接获取不同类型的差异内容:
entriesOnlyOnLeft():返回仅存在于第一个入参map1中的键值对集合entriesOnlyOnRight():返回仅存在于第二个入参map2中的键值对集合entriesDiffering():返回两个Map都存在、但value不相等的键集合,同时包含每个键在两个Map中分别对应的value值entriesInCommon():返回两个Map中键和值完全相等的公共键值对集合
内容的提问来源于stack exchange,提问作者S.Dan
相关产品推荐
相关产品推荐

