查找两个Map之间的差异

46scxncf  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(444)

我有两个Map当前和以前,我想看看是否有任何区别,这两个Map。如果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())));

有没有更好的方法来实现这一点,或者有一个内置的实用函数来实现这类功能?

mwg9r5ms

mwg9r5ms1#

Guava:

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/

4dc9hkyq

4dc9hkyq2#

因为你的钥匙和价值观 Strings ,他们的 .equals() 方法检查逻辑相等性(而不是检查它们是否具有相同的内存地址),因此您可以简单地使用

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

只是要小心,因为如果你有,例如,两个类型的Map Map<K,V> 哪里 V 没有覆盖 .equals() 方法,默认值等于 V 如果不检查逻辑相等性,则它将不起作用。
编辑:
仔细看你的措辞,你认为如果 keySetpreviousMap 包含的所有键 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) 修改基础Map,因此深度复制是为了防止更改上一个Map。如果您同意更改上一个Map,那么您可以删除该方法主体的前三行,然后更改 copyOfPrevprevious .

相关问题