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

技术Java怎么比较两个对象并获取不相等的字段这篇文章主要介绍“Java怎么比较两个对象并获取不相等的字段”,在日常操作中,相信很多人在Java怎么比较两个对象并获取不相等的字段问题上存在疑惑,小编查阅了各式资料,整理出

本文主要介绍“Java如何比较两个对象,得到不相等的字段”。在日常操作中,相信很多人对Java如何比较两个对象,得到不相等的字段有所怀疑。边肖查阅了各种资料,整理出简单易用的操作方法,希望能帮助大家解答“Java如何比较两个对象,得到不相等的字段”的疑惑!接下来,请和边肖一起学习!

00-1010在工作中,我们经常会遇到这样的要求:——、比较两个对象是否相等,如果不相等,则取出不相等的字段。

以下场景要求我们比较对象:

数据比较

进行单元测试以确定对象是否相等。

前端要求突出显示不相等的字段。

这种需求其实很简单,但是如何优雅地解决这种需求呢?

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

每次对象属性改变时,一定要记得重写(别担心,你会忘记的)

每个对象只能有一个equals方法,但是您可能需要不同的匹配规则。

你只能比较两个对象是否相等,却无法确切知道哪个属性不相等。

无法基于getter方法比较自动生成的equals方法。

对象依赖于第三方,不能重写equals方法。

因此,通用比较器的实现可以减少很多不必要的麻烦,帮助我们很好地满足这种要求。

00-1010我在做数据同步的时候有这个要求。我想按照一定的规则把数据库里的数据导入ES。导入完成后,如何比较双方数据是否一致?这个时候,一个好的比较器就是我非常好的帮手。

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

所以,我自己找时间实现了。

写在前面

使用反射来比较传入的对象,提供了基于字段的比较器和基于Getter的比较器,并充分考虑了可伸缩性,因此用户可以重写字段的比较规则。功能比较简单,代码实现也不难,已经做了很多评论,具体实现可以直接查看源代码。

UML图:

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

缘起

非常方便使用,因为它已经上传到maven warehouse:

添加maven依赖项

属国

groupIdcom.github.dadiyang/groupId

artifactIdequator/artifactId

版本1 . 0 . 3/版本

/dependency初始化并调用方法。

equatorequator=new getter base equator();

Useruser1=新用户(.);

Useruser2=新用户(.);

//确定属性是否完全相等

equator.isEquals(user1,user 2);

//获取不同的属性

listfieldfinfodiff=equator . getdifffields(user 1,user 2);00-1010我们可以通过继承和重写isFieldEquals方法来自定义比较规则。例如,当我们进行单元测试时,数据库通常不会存储日期类型字段比较的毫秒数,但是我们在new中提出的日期对象包含毫秒数,因此在比较对象和日期类型字段时,我们需要忽略日期的毫秒数。此时,您可以通过重写isFieldEquals方法对其进行自定义:

/**

*日期不会在数据库中保存毫秒,因此需要特殊处理。比较时间时,忽略毫秒。

*

* @ author adadiyang

*@date2019/3/23

(=NationalBureauofStandards)国家标准局

p;*/
public class MmInsensitiveEquator extends GetterBaseEquator {
    @Override
    protected boolean isFieldEquals(FieldInfo fieldInfo) {
        if (fieldInfo.getFirstVal() instanceof Date) {
            Date first = (Date) fieldInfo.getFirstVal();
            Date second = (Date) fieldInfo.getSecondVal();
            if (Objects.equals(first, second)) {
                return true;
            }
            // 忽略毫秒数
            return Objects.equals(Math.round(first.getTime() / 1000), Math.round(second.getTime() / 1000));
        }
        return super.isFieldEquals(fieldInfo);
    }
}

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

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/116533.html

(0)

相关推荐

  • 如何理解MSSQL数据库后台进程

    技术如何理解MSSQL数据库后台进程本篇文章为大家展示了如何理解MSSQL数据库后台进程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。与Oracle数据库类似,微软数据库产品MS

    攻略 2021年11月29日
  • bv电线规格,BV和BVR线的所有规格

    技术bv电线规格,BV和BVR线的所有规格1、BV、BVV、BVR电源线:简单嘀来说: vv在电线术语是指两层聚露乙烯意义bv电线规格; BV聚露乙烯绝缘铜芯线,独芯线; BVV,聚露乙烯护套铜芯线,两芯线; (图

    生活 2021年10月21日
  • 如何用Python爬取酷我音乐

    技术如何用Python爬取酷我音乐如何用Python爬取酷我音乐,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前两天听了一下酷我音乐官网的音

    攻略 2021年10月26日
  • naalo2怎么读,NaAlO2是什么东西

    技术naalo2怎么读,NaAlO2是什么东西NaAlO2 偏铝酸钠 铝和氢氧化钠2Al+2H2O+2NaOH=2NaAlO2+3H2 氧化铝和氢氧化钠也可以Al2O3+2NaOH=2NaAlO2+H2O化学式NaAlO

    生活 2021年10月19日
  • Jmeter如何使用csv参数化Json数据

    技术Jmeter如何使用csv参数化Json数据这篇文章将为大家详细讲解有关Jmeter如何使用csv参数化Json数据,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。结合

    攻略 2021年11月17日
  • 中国结的象征,“中国结”有哪些象征意义

    技术中国结的象征,“中国结”有哪些象征意义目前中国结的基本结法有十多种,其名称是根据绳结的形状、用途、或者原始的出处和意义来命名的。 1.双钱结中国结的象征:形状像两个中国古铜钱半叠的式样,故名。 2.钮扣

    生活 2021年10月28日