比较两个对象,将不同的字段输出一个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;
}
});