比较相同对象不同的字段,差异字段。

比较两个对象,将不同的字段输出一个map<String,List<Object>>


注意!!!: 如果对象里的不是普通字段而是一个子对象,那么需要再比较

/**
     * 比较两个对象,将不同字段的结果输出到map中去
     *
     * @param oldValue value1
     * @param newValue value2
     * @return Map---> key:Field value:[oldValue,newValue]
     */
public static Map<String, List<Object>> compareFields(Object oldValue, Object newValue, List<String> includeArr, List<String> ignoreArr) {
        try {
            Map<String, List<Object>> map = new HashMap<>(16);
            if (oldValue.getClass() != newValue.getClass()) {
                return map;
            }
            List<String> includeArrList = null;
            List<String> ignoreList = null;
            if (includeArr != null && includeArr.size() > 0) {
                includeArrList = includeArr;
            }
            if (ignoreArr != null && ignoreArr.size() > 0) {
                ignoreList = ignoreArr;
            }
            Class clazz = oldValue.getClass();
            PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz, Object.class).getPropertyDescriptors();
            for (PropertyDescriptor pd : pds) {
                String propName = pd.getName();
                if ((includeArrList != null && !includeArrList.contains(propName)) ||
                    (ignoreList != null && ignoreList.contains(propName))) {
                    continue;
                }
                Method readMethod = pd.getReadMethod();
                Object o1 = readMethod.invoke(oldValue);
                Object o2 = readMethod.invoke(newValue);
                //我比较的对象涉及Bigdecimal,使用equals会有误差,单独处理
                if (o1 instanceof BigDecimal) {
                    if ((((BigDecimal) o1).compareTo((BigDecimal) o2)) != 0) {
                        map.put(propName, Arrays.asList(o1, o2));
                    }
                    continue;
                }
                if (!ArrayUtils.isEquals(o1, o2)) {
                    map.put(propName, Arrays.asList(o1, o2));
                }
            }
            return map;
        } catch (Exception e) {
            throw new RuntimeException("compareFields Error cause by ", e);
        }
    }

我个人对于对象中子对象的比较

Map<String, List<Object>> map = compareFields(oldValue, newValue, includeArr, ignoreArr);
        map.forEach((k, v) -> {
            //子对象的字段名:equipmentStatus
            if ("equipmentStatus".equals(k)) {
				//如果是子对象,那么继续比较
                if(v==null||v.isEmpty()){
                    return;
                }
                Map<String, List<Object>> stringListMap = LogUtils.compareFields(v.get(0), v.get(1),includeArr,ignoreArr);
             
                return;
            }
        });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值