Archangell
V2EX  ›  问与答

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

  •  
  •   Archangell · Aug 6, 2019 · 9167 views
    This topic created in 2647 days ago, the information mentioned may be changed or developed.

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

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

    v 站大佬帮帮忙

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

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

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