判断两个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
    }
}

修改

image-20221216160735507

posted @ 2022-12-16 16:09  进击的小蔡鸟  阅读(933)  评论(0编辑  收藏  举报