Java不同对象判断字段名一致的值是否一致,同时记录在册方便查看

最近项目中遇到了需要对整表数据进行比对是否改变,以及数字类型改变后是变大了还是变小了,想着几个字段随便写写if-else算了, 结果瓦特了,170个字段,搞不了搞不来,写方法把开撸

tps: 方法仅供参考学习

一、主方法

 public List<ContrastResults> contrast(T t) throws Exception {
        //比对结果集
        List<ContrastResults> resultsList = new ArrayList<>();
        //提取保留字段信息,获取原始数据
        JsonNode extend = t.getExtend();
        //将数据中的信息进行置空,减小对象的体积
        t.setExtend(null);
        //将新修改的数据对象转为map处理
        Map<String, Object> map = BeanReflect.beanToMap(t);
        //获取保留字段中保存的原始数据 sourceData此处因为源数据在json字段中,
        //需要根据实际需求进行改造哦
        JsonNode data = extend.get("sourceData");
        //将原始数据转为map
        Map<String, Object> beanToMap = super.objectMapper.convertValue(data, new TypeReference<>() {
        });
        //将对象的map的key提取
        Set<String> keys = map.keySet();
        //循环判断当前字段是否发生了变化
        for (String key : keys) {
            if (FILTER_LIST.contains(key)) {
                continue;
            }
            ContrastResults results = new ContrastResults();
            results.setFieldName(key);
            results.setStatus(0);
            results.setTId(t.getId());
            results.setTenantCode(t.getTenantCode());
            //是否一致,默认一致
            boolean consistent = true;
            if (!ObjectUtils.isEmpty(beanToMap.get(key)) && !ObjectUtils.isEmpty(map.get(key))) {
                Object newData = map.get(key);
                Object oldData = beanToMap.get(key);
                if (newData instanceof Number newO2 && oldData instanceof Number oldO3) {
                    consistent = newO2.equals(oldO3);
                    double v = newO2.doubleValue();
                    double v2 = oldO3.doubleValue();
                    if (v > v2) {
                        results.setStatus(1);
                    } else if (v < v2) {
                        results.setStatus(2);
                    }
                } else if (newData instanceof Boolean newO2 && oldData instanceof Boolean oldO3) {
                    consistent = newO2.equals(oldO3);
                } else if (newData instanceof String newO2 && oldData instanceof String oldO3) {
                    consistent = newO2.equals(oldO3);
                }
            } else {
                Object newData = map.get(key);
                Object oldData = beanToMap.get(key);
                if (!ObjectUtils.isEmpty(newData) && ObjectUtils.isEmpty(oldData)) {
                    if (newData instanceof Number newO2) {
                        double v = newO2.doubleValue();
                        if (v > 0) {
                            results.setStatus(1);
                        } else if (v < 0) {
                            results.setStatus(2);
                        }
                    } else if (newData instanceof Boolean newO2) {
                        consistent = newO2;
                    } else if (newData instanceof String) {
                        consistent = false;
                    }
                }
            }
            results.setIsConsistent(consistent);
            resultsList.add(results);
        }
        return resultsList;
    }

使用主方法时需要注意根据自己的需求进行修改

二、工具类

1. 结果集方法字段展示

   @Schema(title = "主键")
    private Long id;

    @Schema(title = "数据ID")
    private Long tId;

    @Schema(title = "字段名")
    private String fieldName;

    @Schema(title = "是否一致")
    private Boolean isConsistent;

    @Schema(title = "状态:0.默认 1.变大 2.变小")
    private Integer status;

2.对象转Map方法

 /**
     * 对象转Map
     *
     * @param object 需要转换的对象
     * @return 返回转换后的map
     * @throws IllegalAccessException 异常信息
     */
    public static Map<String, Object> beanToMap(Object object) throws IllegalAccessException {
        if (ObjectUtils.isEmpty(object)) {
            return Map.of();
        }
        Map<String, Object> map = new HashMap<>(16);
        Field[] fields = object.getClass().getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            map.put(field.getName(), field.get(object));
        }
        return map;
    }

好啦,到此为止啦。有什么疑惑可以在评论区留言或者私信我,看到会第一时间回复

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值