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

2019 年 8 月 6 日
 Archangell

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

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

v 站大佬帮帮忙

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

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

就这一行代码就可以完成你说的提交的时候对比操作了,如果你要对比的这个字段可能是个对象之类的东西,前端也有 lodash 方法可以直接完成对比
Cstone
2019 年 8 月 6 日
https://javers.org/
这里有一个 maven 工具 javers
康康符不符合你的需求,也是通过发射做的
Cstone
2019 年 8 月 6 日
补充:支持你要的递归对比
champloo
2019 年 8 月 6 日
重写 equels 方法,在 equels 里调用其他对象的 equels 方法,在比较的同时,用数组装数据类型的字符串
Archangell
2019 年 8 月 6 日
感谢大家啦 刚刚找到一个比较靠谱的推荐给大家 https://blog.csdn.net/dadiyang/article/details/88782898 亲测简单类很满足 复杂类的话支持重写对比方法 目前还没来得及写
Archangell
2019 年 8 月 6 日
@panhongbo 是个好办法 但是如何对比出不同值的字段呀

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.xtra.eu.org/t/589382

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX