判断两个Map集合是否相等
原文链接:
判断两个Map集合是否相等
较原文修改了一个map为null时的空指针bug
用途
判断数据是否有差异
代码
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.MapUtils;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
@Slf4j
public class MapCompareTest {
/**
* 判断两个Map是否相等
*
* @param map map1
* @param map2 Map2
* @return true:相等
*/
public static Boolean mapCompare(Map<String, Object> map, Map<String, Object> map2) {
try {
//先对比map是否为null,为空,长度
if (MapUtils.isEmpty(map) && MapUtils.isEmpty(map2)) {
return true;
}
boolean mapIsNull = MapUtils.isEmpty(map) && MapUtils.isNotEmpty(map2);
boolean mapIsNotNull = MapUtils.isNotEmpty(map) && MapUtils.isEmpty(map2);
if (mapIsNull || mapIsNotNull) {
return false;
}
if (map.size() != map2.size()) {
return false;
}
AtomicReference<Boolean> flg = new AtomicReference<>(true);
//再逐个对比每个字段的值
map.forEach((k, v) -> {
// 判断key为空的情况
if (k == null && !map2.containsKey(null)) {
flg.set(false);
}
if (v == null || map2.get(k) == null) {
boolean b = v == null && map2.get(k) != null;
boolean b1 = v != null && map2.get(k) == null;
if (b || b1) {
flg.set(false);
}
}
//如果不忽略字段类型,则使用 else if (!v.equals(map2.get(k))) {
//先转为字符串,防止类型不匹配
else if (!v.toString().equals(map2.get(k).toString())) {
flg.set(false);
}
});
return flg.get();
} catch (Exception e) {
log.warn("Map元素比对异常:{}", e.getMessage());
return false;
}
}
public static void main(String[] args) {
Map<String, Object> map = new HashMap<>();
Map<String, Object> map1 = new HashMap<>();
map.put("a", null);
map.put("ab", 2.342);
map1.put("a", null);
map1.put("ab", "2.342");
System.out.println(mapCompare(map, map1));
// true
}
}
修改