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");//将原始数据转为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不同对象判断字段名一致的值是否一致,同时记录在册方便查看相关推荐
- java反射之Field用法(获取对象的字段名和属性值)
一.概述 Field是一个类,位于java.lang.reflect包下.在Java反射中Field类描述的是类的属性信息,功能包括: 获取当前对象的成员变量的类型 对成员变量重新设值 二.如何获取F ...
- jquery数组去重:纯数字数组去重,forEach判断数组是否含有该字段,单个数组通过某个字段名去重value值,多个数组合并同时根据某个字段进行去重
纯数字数组去重 const numbers = [1, 1, 20, 3, 3, 3, 9, 9]; const uniqueNumbers = [...new Set(numbers)] //输出u ...
- java 反射机制--根据属性名获取属性值
1.考虑安全访问范围内的属性,没有权限访问到的属性不读取 [java] view plaincopy /** * 根据属性名获取属性值 * * @param fieldName * @param ob ...
- 循环给对象创建属性名和属性值
4.7号笔记: ① 循环给对象创建属性名和属性值: data.forEach(item => {item.identity = identity;})console.log(data);
- 对象的属性名与属性值
注意共有5个步骤,按顺序操作下去 1.在对象中保存的值称为属性,对象的属性名不强制要求遵守标识符规则,什么名称都可以,我对象属性的语法:1对象.属性名,注意:如果对象中没有的属性,不报错而是返回und ...
- 如何获取java对象的字段名_Java如何获取类对象的字段?
下面的示例使用反射获取类对象的字段.我们将获取字段名称及其对应的类型.下面显示了三种可用于获取对象字段的方式:Class.getDeclaredFields() Class.getFields() C ...
- java怎么通过字段去获取对象_通过java反射获取任意对象的字段名及字段值
import java.lang.reflect.Field; public class ReflectClass3 { /** * @param args */ public static void ...
- [转载] java给对象中的包装类设置默认值
参考链接: Java中的对象类Object 处理方法如下 主要适用于,对象中使用了包装类,但是不能给null需要有默认值的情况 /** * 处理对象中包装类,因为快捷签没有用包装类 * * @para ...
- JavaScript中的对象的属性名和属性值
1.属性名 创建一个对象 var obj =new Object(); 向对象中添加属性 obj.name ="Jerry"; 那么,name就是属性名,"Jerry&q ...
最新文章
- Flutter 制作一个具有酷炫液体滑动效果的酷炫入门页面
- kvm直通sata_基于KVM的SRIOV直通配置及性能测试
- c语言中memcpy函数_带有示例的C中的memcpy()函数
- 使用ab进行页面的压力测试
- linux+基因组字符替换,liftover基因组版本直接的coordinate转换
- CentOS7.2中安装rabbitmq
- OC基础--成员变量的封装
- Python实现双端队列
- 安卓判断服务器返回的状态码,关于服务器返回的十四种常见HTTP状态码详解
- python装饰器解析请求参数_我如何在装饰器中获得Flask可选的URL参数?
- 至少清楚知道兼容IE8 ie9 ;持续更新
- 菜鸟的IT道路ing (六)
- mac及idea常用快捷键
- Unity2D小游戏——类似QQ堂的小 demo(炸弹人)
- QT5单元测试(按键测试)
- 第一课 以太坊开发从入门到精通学习导航
- css实现人走路效果,如何使用纯CSS实现一个人独自行走的动画效果(附源码)
- 从keras看VGG16结构图
- Magnetic Actuation for Full Dexterity Microrobotic Control Using Rotating Permanent Magnets
- Matlab的数据导入与拟合