如何将Java中Maps.difference的结果转换为Map?附JSON对比代码
How to Store Guava Maps.difference Result as a Map?
Question
我有一段用于找出两个JSON字符串差异的Java代码,如下所示:
String afterString = converterUtil.convertObjectToJson(targetObject); Gson g = new Gson(); Type mapType = new TypeToken<Map<String, Object>>() { }.getType(); Map<String, Object> firstMap = g.fromJson(beforeString, mapType); Map<String, Object> secondMap = g.fromJson(afterString, mapType); System.out.println(Maps.difference(firstMap, secondMap));请问如何将该差异结果保存为Map?
Answer
嘿,我来给你梳理下怎么实现——你用的是Guava的Maps.difference()方法,它返回的是MapDifference<K, V>对象,而非直接的Map。要把差异转换成常规Map,得看你想要保留哪些类型的差异,下面给你两种常见的处理方式:
1. 合并所有差异到单个Map
如果你想把所有有差异的条目(左边独有的、右边独有的、键同值异的)都放到一个Map里,可以这么写:
// 先获取差异对象 MapDifference<String, Object> diff = Maps.difference(firstMap, secondMap); // 创建一个空Map来存储最终差异 Map<String, Object> diffResultMap = new HashMap<>(); // 加入左边独有的条目 diffResultMap.putAll(diff.entriesOnlyOnLeft()); // 加入右边独有的条目 diffResultMap.putAll(diff.entriesOnlyOnRight()); // 处理键同值异的条目:这里示例存右边的新值,你也可以存新旧值的组合 diff.entriesDiffering().forEach((key, valueDiff) -> { // 比如存新值(右边的) diffResultMap.put(key, valueDiff.rightValue()); // 要是想同时保留新旧值,可以用一个自定义对象或者Guava的Pair: // diffResultMap.put(key, Pair.of(valueDiff.leftValue(), valueDiff.rightValue())); });
2. 按差异类型分类存储
如果需要区分不同类型的差异(比如哪些是左边独有、哪些是右边新增、哪些是值变更),可以把它们放到一个嵌套Map里:
MapDifference<String, Object> diff = Maps.difference(firstMap, secondMap); Map<String, Object> categorizedDiffMap = new HashMap<>(); // 左边独有的条目 categorizedDiffMap.put("onlyInBefore", diff.entriesOnlyOnLeft()); // 右边独有的条目 categorizedDiffMap.put("onlyInAfter", diff.entriesOnlyOnRight()); // 值不同的条目(保留新旧值对比) categorizedDiffMap.put("valueChanged", diff.entriesDiffering());
小提示
entriesDiffering()返回的Map里,值是ValueDifference<V>类型,调用leftValue()和rightValue()就能拿到前后两个值。- 确保你的项目里已经引入了Guava依赖,这些方法都是Guava提供的工具类功能~
内容的提问来源于stack exchange,提问作者iftekhar iftekhar
相关产品推荐
相关产品推荐

