首页 > 其他分享 >比较两个实体属性值,返回一个map以有差异的属性名为key,value为一个Map分别存oldObject,newObject此属性名的值

比较两个实体属性值,返回一个map以有差异的属性名为key,value为一个Map分别存oldObject,newObject此属性名的值

时间:2022-11-15 11:15:36浏览次数:36  
标签:map newObject oldObject oldValue valueMap null newValue 属性

 1     /**
 2      * 比较两个实体属性值,返回一个map以有差异的属性名为key,value为一个Map分别存oldObject,newObject此属性名的值
 3      *
 4      * @param oldObject 进行属性比较的对象1
 5      * @param newObject 进行属性比较的对象2
 6      * @return 属性差异比较结果map
 7      */
 8     @SuppressWarnings("rawtypes")
 9     public static Map<String, Map<String, BigDecimal>> compareFields(Object oldObject, Object newObject) {
10         Map<String, Map<String, BigDecimal>> map = null;
11         try {
12             /**
13              * 只有两个对象都是同一类型的才有可比性
14              */
15             if (oldObject.getClass() == newObject.getClass()) {
16                 map = new HashMap<String, Map<String, BigDecimal>>();
17                 Class clazz = oldObject.getClass();
18                 //获取object的所有属性
19                 PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz, Object.class).getPropertyDescriptors();
20                 for (PropertyDescriptor pd : pds) {
21                     //遍历获取属性名
22                     String name = pd.getName();
23                     //获取属性的get方法
24                     Method readMethod = pd.getReadMethod();
25                     // 在oldObject上调用get方法等同于获得oldObject的属性值
26                     Object oldValue = readMethod.invoke(oldObject);
27                     // 在newObject上调用get方法等同于获得newObject的属性值
28                     Object newValue = readMethod.invoke(newObject);
29                     if (oldValue instanceof List) {
30                         continue;
31                     }
32                     if (newValue instanceof List) {
33                         continue;
34                     }
35                     if (oldValue instanceof Timestamp) {
36                         oldValue = new Date(((Timestamp) oldValue).getTime());
37                     }
38                     if (newValue instanceof Timestamp) {
39                         newValue = new Date(((Timestamp) newValue).getTime());
40                     }
41                     if (newValue == null) {
42                         continue;
43                     }
44                     if (oldValue == null && newValue == null) {
45                         continue;
46                     } else if (oldValue == null && newValue != null) {
47                         Map<String, BigDecimal> valueMap = new HashMap<>();
48                         if (oldValue == null) {
49                             valueMap.put(StockPredictConstants.PROFIT_OLD_VALUE, null);
50                         } else {
51                             valueMap.put(StockPredictConstants.PROFIT_OLD_VALUE, new BigDecimal(oldValue.toString()));
52                         }
53                         if (newValue == null) {
54                             valueMap.put(StockPredictConstants.PROFIT_NEW_VALUE, null);
55                         } else {
56                             valueMap.put(StockPredictConstants.PROFIT_NEW_VALUE, new BigDecimal(newValue.toString()));
57                         }
58                         map.put(name, valueMap);
59                         continue;
60                     }
61                     BigDecimal oldBigDecimal = null;
62                     BigDecimal newBigDecimal = null;
63                     if (oldValue == null) {
64                         oldBigDecimal = null;
65                     } else {
66                         oldBigDecimal = new BigDecimal(oldValue.toString());
67                     }
68                     if (newValue == null) {
69                         newBigDecimal = null;
70                     } else {
71                         newBigDecimal = new BigDecimal(newalue.toString());
72                     }
73                     // 比较这两个值是否相等,不等就可以放入map了
74                     if (oldBigDecimal.compareTo(newBigDecimal) != 0) {
75                         Map<String, BigDecimal> valueMap = new HashMap<>();
76                         valueMap.put(StockPredictConstants.PROFIT_OLD_VALUE, oldBigDecimal);
77                         valueMap.put(StockPredictConstants.PROFIT_NEW_VALUE, newBigDecimal);
78                         map.put(name, valueMap);
79                     }
80                 }
81             }
82         } catch (Exception e) {
83             LOGGER.error("比较两个实体属性值比较两个实体属性值出错", e);
84         }
85         return map;
86     }

 

标签:map,newObject,oldObject,oldValue,valueMap,null,newValue,属性
From: https://www.cnblogs.com/yxl-wyb/p/16891705.html

相关文章

  • 列表list+map
    1.对可迭代函数中的每一个元素使用该方法,结果作为列表返回:defadd20(number):number=number+20returnnumberlist1=[1,2,3]newlist=map(add20,list1)pri......
  • 后端接口返回实体类属性为null直接过滤不返回
    问题:项目中,有时候实体类很多字段是不会用上的,返回给前端的时候有很多null,显得返回的报文十分臃肿解决办法:只需要在返回的实体类上面加上@JsonInclude(JsonInclude.Inclu......
  • 74.数组map能干什么,会改变原数组吗
    map是处理数据的方法,不会改变原数组,会返回一个新数组;filter也不会改变原数组,会返回新数组;forEach也不会改变原数组,不会返回新数组;reduce不会改变原数组; 是否改......
  • 【AGC】远程配置如何传入自定义属性
    ​背景:现在AGC远程配置端侧服务提供的SDK支持传入自定义属性获取和更新云端配置数据了。下面将通过一个demo集成远程配置SDK来实现这一功能。 集成准备1.在AGC创建工......
  • 8-1 configmap
    configmapConfigMap是一种API对象,用来将非机密性的数据保存到键值对中。使用时,Pods可以将其用作环境变量、命令行参数或者存储卷中的配置文件。ConfigMaP将环境配置......
  • 本地部署 mapshaper
    mapshaper用来在shpkmlgeojson之间互相转换格式十分方便。Cesiumlab也内置,故也想本地部署一套。从github下载源码包,www文件夹下面liveserver运行index.html测......
  • 11.Series常用属性和方法
    3)Series的基本概念可以把Series看成一个定长的有序字典可以通过shape,size,index,values等得到series的属性可以使用head(),tail()分别查看前n个和后n个值当索引没......
  • 使用MapStruct出现了No property named "productId" exists in source parameter(s).
    pom.xml<properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.buil......
  • MapReduce框架原理
    1MapReduce工作流程1)流程示意图2)流程详解上面的流程是整个mapreduce最全工作流程,但是shuffle过程只是从第7步开始到第16步结束,具体shuffle过程详解,如下:1)maptask收集我们的m......
  • sqlserver xml 操作:3、对不确定结构、属性的xml进行处理
    sqlserverxml操作:3、对不确定结构、属性的xml进行处理在平时使用过程中,xml的结构一般都是已经确定了的,所以我们读取并不是很麻烦的事,但如果一旦结构或数据不确定,......