找出两张地图之间的差异

Find the differences between two maps

我有两张地图,现在的和以前的,我想看看这两张地图之间是否有任何区别。如果 currentMap 中存在新键,或者同一键的值不同,我可以停止。

Map<String, String> previousValue;
Map<String, String> currValue;

boolean isChangePresent = currValue.entrySet().stream().anyMatch(
                    x -> !previousValue.containsKey(x.getKey()) ||
                        (previousValue.get(x.getKey()) != null && !previousValue.get(x.getKey()).equals(
                            x.getValue())));

是否有更好的方法来执行此操作或执行此类操作的内置实用程序函数?

由于您的键和值只是 Strings,它们的 .equals() 方法检查逻辑相等性(而不是检查它们是否具有相同的内存地址),因此您可以简单地使用

boolean check(Map<String, String> a, Map<String, String> b) {
     return a.equals(b);
}

请注意,例如,如果您有两个 Map<K,V> 类型的映射,其中 V 没有覆盖 .equals() 方法,并且 V不检查逻辑是否相等,那就不行。

编辑:

仔细看看你的措辞,如果 previousMapkeySet 包含 currentMap 的所有键,你认为存在变化吗? currentMap 的键比 previousMap 少?如果您认为没有变化那么您需要做的是

boolean check(Map<String, String> previous, Map<String, String> current) {
         Map<String,String> copyOfPrev = new HashMap<>();
         previous.forEach((k,v) -> copyOfPrev.put(k,v));
         copyofPrev.keySet().retainAll(current.keySet());
         return copyOfPrev.equals(current);
    }

记住Map<K, V>#keySet().retainAll(Collection<K> c)会修改底层地图,所以深拷贝是为了防止对之前地图的修改。如果您可以更改之前的地图,那么您可以删除该方法主体的前三行,并将 copyOfPrev 更改为 previous.

在番石榴中:

MapDifference<String, String> mapDifference = Maps.difference(currValue, previousValue);

return !mapDifference.entriesOnlyOnLeft().isEmpty() 
        || !mapDifference.entriesDiffering().isEmpty();

https://www.leveluplunch.com/java/examples/guava-map-difference-example/