最近项目中遇到了需要对整表数据进行比对是否改变,以及数字类型改变后是变大了还是变小了,想着几个字段随便写写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");//将原始数据转为mapMap<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;}

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

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

  1. java反射之Field用法(获取对象的字段名和属性值)

    一.概述 Field是一个类,位于java.lang.reflect包下.在Java反射中Field类描述的是类的属性信息,功能包括: 获取当前对象的成员变量的类型 对成员变量重新设值 二.如何获取F ...

  2. jquery数组去重:纯数字数组去重,forEach判断数组是否含有该字段,单个数组通过某个字段名去重value值,多个数组合并同时根据某个字段进行去重

    纯数字数组去重 const numbers = [1, 1, 20, 3, 3, 3, 9, 9]; const uniqueNumbers = [...new Set(numbers)] //输出u ...

  3. java 反射机制--根据属性名获取属性值

    1.考虑安全访问范围内的属性,没有权限访问到的属性不读取 [java] view plaincopy /** * 根据属性名获取属性值 * * @param fieldName * @param ob ...

  4. 循环给对象创建属性名和属性值

    4.7号笔记: ​ ① 循环给对象创建属性名和属性值: data.forEach(item => {item.identity = identity;})console.log(data);

  5. 对象的属性名与属性值

    注意共有5个步骤,按顺序操作下去 1.在对象中保存的值称为属性,对象的属性名不强制要求遵守标识符规则,什么名称都可以,我对象属性的语法:1对象.属性名,注意:如果对象中没有的属性,不报错而是返回und ...

  6. 如何获取java对象的字段名_Java如何获取类对象的字段?

    下面的示例使用反射获取类对象的字段.我们将获取字段名称及其对应的类型.下面显示了三种可用于获取对象字段的方式:Class.getDeclaredFields() Class.getFields() C ...

  7. java怎么通过字段去获取对象_通过java反射获取任意对象的字段名及字段值

    import java.lang.reflect.Field; public class ReflectClass3 { /** * @param args */ public static void ...

  8. [转载] java给对象中的包装类设置默认值

    参考链接: Java中的对象类Object 处理方法如下 主要适用于,对象中使用了包装类,但是不能给null需要有默认值的情况 /** * 处理对象中包装类,因为快捷签没有用包装类 * * @para ...

  9. JavaScript中的对象的属性名和属性值

    1.属性名 创建一个对象 var obj =new Object(); 向对象中添加属性 obj.name ="Jerry"; 那么,name就是属性名,"Jerry&q ...

最新文章

  1. Flutter 制作一个具有酷炫液体滑动效果的酷炫入门页面
  2. kvm直通sata_基于KVM的SRIOV直通配置及性能测试
  3. c语言中memcpy函数_带有示例的C中的memcpy()函数
  4. 使用ab进行页面的压力测试
  5. linux+基因组字符替换,liftover基因组版本直接的coordinate转换
  6. CentOS7.2中安装rabbitmq
  7. OC基础--成员变量的封装
  8. Python实现双端队列
  9. 安卓判断服务器返回的状态码,关于服务器返回的十四种常见HTTP状态码详解
  10. python装饰器解析请求参数_我如何在装饰器中获得Flask可选的URL参数?
  11. 至少清楚知道兼容IE8 ie9 ;持续更新
  12. 菜鸟的IT道路ing (六)
  13. mac及idea常用快捷键
  14. Unity2D小游戏——类似QQ堂的小 demo(炸弹人)
  15. QT5单元测试(按键测试)
  16. 第一课 以太坊开发从入门到精通学习导航
  17. css实现人走路效果,如何使用纯CSS实现一个人独自行走的动画效果(附源码)
  18. 从keras看VGG16结构图
  19. Magnetic Actuation for Full Dexterity Microrobotic Control Using Rotating Permanent Magnets
  20. Matlab的数据导入与拟合

热门文章

  1. Android 检测手机IMEI值
  2. ThingsBoard教程(二一):使用消息类型和数据处理节点对数据处理后保存
  3. java调用druid_Druid监控分布式实现过程解析
  4. bootstrap4 入门学习
  5. HBASE服务器启动与关闭
  6. 李彦宏发内部邮件反思:鼓励狼性、淘汰小资
  7. Proxmark3 一键刷固件工具 20191125
  8. MySQL入门--显示表结构的两种方式
  9. Spark2.2.0集群搭建部署之【HADOOP集群篇】
  10. 《神奇宝贝》99%的90后都看过吧?Python让我成为了一名训练师!去吧,皮卡丘!