You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:46:58