Java怎么比较两个对象并获取不相等的字段

  介绍

这篇文章主要介绍“Java怎么比较两个对象并获取不相等的字段”,在日常操作中,相信很多人在Java怎么比较两个对象并获取不相等的字段问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答“Java怎么比较两个对象并获取不相等的字段”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

,写在前面

在工作中,我们经常会遇到这样的需求,比较两个对象是否相等,如果不相等的话,取出不相等的字段。

以下这些场景都需要我们对一个对象进行比较:

<李>

数据比对

<李>

做单元测试断言对象是否相等

<李>

前端要求对不相等的字段进行高亮显示

这种需求其实是非常简单的,但是如何优雅地解决这一类需求呢?

通常的做法是重写对象的=方法。但是重写=方法有很多缺点,例如:

<李>

每次对象属性有变更,一定要记得再重写(放心,你一定会忘记的)

<李>

每个对象只能有一个平等的方法,但是可能你会需要不同的比对规则

<李>

只能对比两个对象是否相等,无法具体知道哪个属性不等

<李>

自动生成的=方法无法基于getter方法进行比对

<李>

对象来自第三方依赖,无法重写=方法

因此,实现一个通用的比对器可以减少很多不必要的麻烦,帮助我们很好地完成这一类的需求。

缘起

我是在做数据同步的时候有这个需求,我要将数据库的数据通过一定的规则导入到ES中,导入完成之后,如何比对两边的数据是否一致呢?这时候一个好用的比对器就是我非常好的帮手。

另外,我在做单元测试的时候发现,经常会需要将被测方法的返回值和期望的结果做assertequal断言这时这个比对器也非常有帮助。我发现很多同事经常会遇到类似的需求。

于是,我找时间自己实现了一下。

实现

使用反射对传入的对象进行比,对提供了基于字段的比较器和基于getter方法的对比器,并且充分考虑扩展性,使用者可以重写字段的比对规则。功能相对简单,代码实现也不难,而且做了很多注释,具体实现可以直接查看源码。

UML图:

癑ava怎么比较两个对象并获取不相等的字段"

使用方法

因为已经上传到仓了maven库中,我们使用非常方便:

添加maven依赖

& lt; dependency>   ,,,& lt; groupId> com.github.dadiyang   ,,,& lt; artifactId> equator   ,,,& lt; version> 1.0.3   & lt;/dependency>

初始化并调用方法

Equator  Equator =, new  GetterBaseEquator ();   User  user1 =, new 用户(…);   User  user2 =, new 用户(…);//,判断属性是否完全相等   equator.isEquals (user1, user2);//,获取不同的属性   List

扩展

我们可以通过继承并重写isFieldEquals方法自定义比对规则,例如我们在做单元测试的时候,对于日期类型的字段的比对,通常数据库不保存毫秒数,而我们新出来的日期对象则包含了毫秒数,因此我们在对包含日期类型字段的对象做比对的时候需要忽略日期的毫秒数。这时就可以通过重写isFieldEquals方法来自定义了:

/* *   ,*日期在数据库不保存毫秒数,因此需要特殊处理,比对时间时,忽略毫秒数   ,*   ,* @author  dadiyang   ,* @date  2019/3/23   ,*/public  class  MmInsensitiveEquator  extends  GetterBaseEquator  {   ,,@Override   ,,,protected  boolean  isFieldEquals (FieldInfo  fieldInfo), {   ,,,,,,,if  (fieldInfo.getFirstVal (), instanceof 日期),{   ,,,,,,,,,,,Date  first =,(日期),fieldInfo.getFirstVal ();   ,,,,,,,,,,,Date  second =,(日期),fieldInfo.getSecondVal ();   ,,,,,,,,,,,if  (Objects.equals(第一,,第二),{   ,,,,,,,,,,,,,,,return 真实;   ,,,,,,,,,,,}   ,,,,,,,,,,,//,忽略毫秒数   ,,,,,,,,,,,return  Objects.equals (Math.round (first.getTime (),/, 1000),, Math.round (second.getTime (),/, 1000));   ,,,,,,,}   ,,,,,,,return  super.isFieldEquals (fieldInfo);   ,,,}   }

到此,关于“Java怎么比较两个对象并获取不相等的字段”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

Java怎么比较两个对象并获取不相等的字段