快速对比两个对象中属性是否相同,哪些属性不同?

在工作中遇到一个需求,要识别一个数据前后的数据变更项有哪些,返回这个集合给另外一个系统用来更新数据。
核心思路有两步:

使用工具类将对象转map
通过keyset或者entryset遍历,分别取新旧对象该属性的值,如果不同则存进集合中
domain

public class User{ 
    private String name; 
    private String age; 
    private String address; 
}

service

import com.baomidou.mybatisplus.core.toolkit.BeanUtils;

private List<String> dealDiff(User userNew, User userOld) { 
    List<String> resultList = new ArrayList<>(); 
    Map<String, Object> userNewMap = BeanUtils.beanToMap(userNew); 
    Map<String, Object> userOldMap = BeanUtils.beanToMap(userOld); 
    for (String key : userNewMap .keySet()) { 
		if (!(ObjectUtils.isEmpty(userNewMap .get(key)) ? userNewMap .get(key) == userOldMap .get(key) : userNewMap .get(key).equals(userOldMap .get(key)){ 
			resultList.add(key); 
		} 
	} 
	return resultList; 
}

中间的if判断思路:

  1. 如果新对象get(key)null,那么可以用==来判断,只要旧对象get(key)不为null,说明是有值的,则可以区分值是否不同
  2. 如果新对象get(key)null,那么可以用equals来判断,无论旧对象get(key)是否为null,都可以判断。不过前提是其中如果有自定义的对象,先重写其equals()hashCode()

不过这样写有一个问题目前还无法识别:String类型的""null无法对比,需要加一个StringUtil来判断,或者分析业务中该字段是否存在null的情况,如果有的话,给赋一个"",可以规避该情况。
其他问题暂时没有想到,想到的小伙伴请留言,谢谢

posted @ 2020-10-29 20:05  来迁  阅读(2203)  评论(0)    收藏  举报