V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Archangell
V2EX  ›  问与答

Java 中如何对比两个对象的属性值全都相同

  •  
  •   Archangell · 2019-08-06 09:18:38 +08:00 · 7832 次点击
    这是一个创建于 1942 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有没有什么工具类可以实现判断同类的两个对象中的值有哪些相同哪些不同,类中属性也可能是其他类也要进行判断是否相同

    举例提交对比 当用户提交一次信息后不通过 第二次提交想要有对比这样的情况对比有哪些字段值不同或相同

    v 站大佬帮帮忙

    22 条回复    2019-08-06 11:24:26 +08:00
    cpyhaha
        1
    cpyhaha  
       2019-08-06 09:24:22 +08:00
    重写 toString 和 equals 就行了
    cpyhaha
        2
    cpyhaha  
       2019-08-06 09:25:38 +08:00
    额 你是要比对每个字段啊,那不太清楚
    crayygy
        3
    crayygy  
       2019-08-06 09:27:04 +08:00 via Android
    不就是 equals 重写一下吗?当然也可以 kotlin data class
    hihipp
        4
    hihipp  
       2019-08-06 09:27:16 +08:00
    我想到的思路是用反射,获取属性值进行比较。
    nihaoaa
        5
    nihaoaa  
       2019-08-06 09:31:31 +08:00
    只能用反射了,用反射重写下 equals 吧
    passerbytiny
        6
    passerbytiny  
       2019-08-06 09:33:49 +08:00
    判断小黑和小白长得一不一样,让小黑自己去判断是最直接,以及最有效的方法。
    Archangell
        7
    Archangell  
    OP
       2019-08-06 10:09:05 +08:00
    @cpyhaha 如果只是单类还好说 如果类中包含其他类 如何对比
    Archangell
        8
    Archangell  
    OP
       2019-08-06 10:10:52 +08:00
    @nihaoaa
    @hihipp 嗯 最简单直接的办法就是反射了 通过获取每个属性值 如果是类的就递归进去 吧这个类中的属性值也判断一遍 但总感觉这样做过于繁琐 而且效率不高
    panhongbo
        9
    panhongbo  
       2019-08-06 10:28:45 +08:00
    转 json,字符串 equals
    MaoMiao
        10
    MaoMiao  
       2019-08-06 10:29:58 +08:00
    apache commons 里有 EqualsBuilder
    icedir
        11
    icedir  
       2019-08-06 10:30:03 +08:00
    楼上的方案我经常用。。
    icedir
        12
    icedir  
       2019-08-06 10:30:25 +08:00
    我说的是 9 楼的
    cpyhaha
        13
    cpyhaha  
       2019-08-06 10:38:50 +08:00
    @Archangell #7 这样的需求我也没遇到过,坐等大佬,不过话说回来,页面不刷新的话,让前端去比较会不会方便一点
    tslling
        14
    tslling  
       2019-08-06 10:42:57 +08:00 via Android
    反射太 hack 了吧,转 json 比字符串更 hack。重写 equals 是标准做法,属性是对象再递归调用它的 equals,用 apache commons 的辅助方法吧。重写 equals 别忘了重写 hashCode。。。
    Sapp
        15
    Sapp  
       2019-08-06 10:46:24 +08:00
    这个提示给前端其实比较好做,只需要吧上一次的保留下来,这次点提交的时候判断一下就行了,比如 react 可以这么干

    {xx[key] === oo[key] ? null : <p>* 字段不同</p>}

    就这一行代码就可以完成你说的提交的时候对比操作了,如果你要对比的这个字段可能是个对象之类的东西,前端也有 lodash 方法可以直接完成对比
    Cstone
        16
    Cstone  
       2019-08-06 10:48:11 +08:00
    https://javers.org/
    这里有一个 maven 工具 javers
    康康符不符合你的需求,也是通过发射做的
    Cstone
        17
    Cstone  
       2019-08-06 10:53:03 +08:00
    补充:支持你要的递归对比
    champloo
        18
    champloo  
       2019-08-06 11:00:31 +08:00 via Android
    重写 equels 方法,在 equels 里调用其他对象的 equels 方法,在比较的同时,用数组装数据类型的字符串
    Archangell
        19
    Archangell  
    OP
       2019-08-06 11:13:42 +08:00
    感谢大家啦 刚刚找到一个比较靠谱的推荐给大家 https://blog.csdn.net/dadiyang/article/details/88782898 亲测简单类很满足 复杂类的话支持重写对比方法 目前还没来得及写
    Archangell
        20
    Archangell  
    OP
       2019-08-06 11:15:06 +08:00
    @panhongbo 是个好办法 但是如何对比出不同值的字段呀
    Archangell
        21
    Archangell  
    OP
       2019-08-06 11:17:28 +08:00
    @Sapp 嗯 不过情况稍微不同 需要后端来判断两个对象有那些个字段值不同 业务现在是这样的 有些值不同无所谓 有些值做改动了 就需要重新提交审核 目前就是需要后端来判断那几个关键字段的值是否改动 在做后续处理
    Archangell
        22
    Archangell  
    OP
       2019-08-06 11:24:26 +08:00
    @Cstone 牛逼老铁 这就是我苦苦追寻的 666 https://javers.org/ 好东西
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1262 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:00 · PVG 02:00 · LAX 10:00 · JFK 13:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.