Java 找出两张地图之间的差异
我有两张当前和以前的地图,我想看看这两张地图之间是否有任何区别。如果currentMap中存在新键,或者同一键的值不同,我可以停止Java 找出两张地图之间的差异,java,guava,Java,Guava,我有两张当前和以前的地图,我想看看这两张地图之间是否有任何区别。如果currentMap中存在新键,或者同一键的值不同,我可以停止 Map<String, String> previousValue; Map<String, String> currValue; boolean isChangePresent = currValue.entrySet().stream().anyMatch( x -> !previousVa
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())));
Map-previousValue;
地图价值;
布尔值isChangePresent=currValue.entrySet().stream().anyMatch(
x->!previousValue.containsKey(x.getKey())||
(previousValue.get(x.getKey())!=null&&!previousValue.get(x.getKey())。等于(
x、 getValue());
有没有更好的方法来实现这一点,或者有一个内置的实用程序函数来实现这类功能?由于您的键和值只是
字符串,它们的.equals()
方法检查逻辑相等性(而不是检查它们是否具有相同的内存地址),因此您可以简单地使用
boolean check(Map<String, String> a, Map<String, String> b) {
return a.equals(b);
}
请记住,Map#keySet().retainal(集合c)
会修改基础映射,因此深度复制是为了防止对上一个映射进行更改。如果您可以更改上一张地图,那么您只需删除该方法主体的前三行,然后将番石榴中的copyOfPrev
更改为previous
:
MapDifference<String, String> mapDifference = Maps.difference(currValue, previousValue);
return !mapDifference.entriesOnlyOnLeft().isEmpty()
|| !mapDifference.entriesDiffering().isEmpty();
MapDifference MapDifference=Maps.difference(currValue,previousValue);
回来!mapDifference.entriesOnlyOnLeft().isEmpty()
|| !mapDifference.EntriesDifferenting().isEmpty();
previousValue.equals(currValue)
有什么问题?@AndyTurner它不执行OP似乎要求的操作:即检查currValue中的所有条目是否包含在previousValue中。i、 例如:previousValue.entrySet().containsAll(currValue.entrySet())
为什么不简单地使用previousValue.entrySet().containsAll(currValue.entrySet())
?@JBNizet是的,这是一种更好的方法,我没有意识到你在放置entrySet。我的建议是用一种更为手工的方式来完成你的建议。虽然有些东西告诉我OP真的只是想检查地图是否完全相等,但措辞暗示了你在这里提到的。
MapDifference<String, String> mapDifference = Maps.difference(currValue, previousValue);
return !mapDifference.entriesOnlyOnLeft().isEmpty()
|| !mapDifference.entriesDiffering().isEmpty();