@EqualsAndHashcode
class MyClass {
String property1;
List<NewClass> newClassList;
}
@EqualsAndHashcode
class NewClass {
String abc;
String xyz;
}
如果我比较< code>MyClass(用< code>@EqualsAndHashcode注释)的两个对象是否相等,是否会检查< code>newClassList属性的顺序?
这取决于你想要什么类型的比较。比较[1,1,2]==[1,2,2]
应该返回true吗?如果是,那么您可以将列表转换为set(也许您也应该在类中使用Set):
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyClass that = (MyClass) o;
if (this.newClassList == null && that. newClassList == null) return true;
if (this.newClassList != null && that.newClassList != null
&& this.newClassList.size() == that.newClassList.size()) {
return new HashSet(this.newClassList).equals(new HashSet(that.newClassList));
}
return false;
}
否则,您必须对列表中的元素进行排序并进行比较:
public boolean equals(Object o) {
// same code as before, except the HashSet part
List<NewClass> one = new ArrayList<NewClass>(this.newClassList);
List<NewClass> two = new ArrayList<NewClass>(that.newClassList);
Collections.sort(one);
Collections.sort(two);
return one.equals(two);
另外,您必须为NewClass
定义自己的比较器,因此sor
方法知道如何对元素进行排序。
通过使用@EqualsAndHashcode
它将传播到使用newClassList.equals(…)
方法,根据java doc
接口列表
boolean equals(Object o)将指定对象与此列表进行比较是否相等。当且仅当指定对象也是列表时返回true,两个列表具有相同的大小,并且两个列表中所有对应的元素对都相等。(两个元素e1和e2是相等的if(e1==null? e2==null:e1.equals(e2))。)换句话说,如果两个列表以相同的顺序包含相同的元素,则它们被定义为相等。该定义确保equals方法在List接口的不同实现中正常工作。
如果您想要一个列表不检查顺序的自定义功能,那么您必须删除@EqualsAndHashcode
,并根据需要提供您自己的等于
方法。
您想要的功能将以一种简单的方式
(list1 != null && list2 != null && list1.size() == list2.size() && list1.containsAll(list2) && list2.containsAll(list1) ) || (list1 == null && list2 == null)
这将引导我们到以下等于方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
NewClass newClass = (NewClass) o;
return Objects.equals(property1, newClass.property1) &&
((newClassList != null && newClass.newClassList != null && newClassList.size() == newClass.newClassList.size() && newClassList.containsAll(newClass.newClassList) && newClass.newClassList.containsAll(newClassList) ) || (newClassList == null && list2 == null));
}
也不要忘记手动覆盖hashcode
方法。
我在gradle项目中使用lombok,希望创建一个jar文件,但每次我执行jar任务(无论是在控制台还是eclipse ide中触发)时,我都会发现错误,我的lombok导入在我使用lombok注释的类中找不到。输出示例: 搜索了一段时间后,我发现有一个适用于gradle和lombok的插件,但在使用较新的gradle版本编译时并不真正需要。我的gradle版本是3.4.1和lombok 1.6
问题内容: 我有一堂课,看起来像这样: 在这里,我不得不写a,因为如果我想在使用Lombok时返回Optional,则必须声明为。这将生成一个接受的生成器方法! 还有其他方法可以使用lombok 吗? 问题答案: 答案是否定的,可能永远也不会。 您可能做错了:-) 并不是预防的替代品,也不是预防的奇特方法。这表示该问题无法回答,例如:空人员列表的平均年龄是多少。 绝对不应传递,而应尽快由调用代码取
我有一个名为Address的类,如下所示: 在这里,我不得不编写生成器和Getter,因为如果我想在使用Lombok时返回一个Optional,我必须将第2行声明为Optional 是否有其他方法可以将lombok与
我试着在IntelliJ上使用Lombok和Maven和VRaptor,但它不起作用。 我已经在stackoverflow中阅读了一些信息,但没有解决我的问题,我已经在Intellij中启用了注释处理器,但仍然一无所获。 我也试图从命令行(Windows)编译它,但没有成功。 我还尝试在没有maven的情况下创建另一个项目,添加库,创建一些用于测试的类,它可以完美地工作、编译和运行。 有什么帮助吗
我在Intellij遇到了一个奇怪的问题。我正在使用Lombok(1.18.2)、IntelliJ(2018.2.2)和JUnit 5在gradle 4多模块项目中。 我花了好几个小时来复制这个。 > 运行所有具有覆盖率测试用例。 移除龙目镜并在此之后生成吸气剂和定型剂也没有效果。 尝试了一切来解决这个问题(启用注释处理器、Lombok插件、清理构建),但没有成功。 编辑1: Root build
如果我比较MyClass的两个对象(用@EqualsAndHashcode注释)是否相等,是否会检查newClassList属性的顺序?