gpt4 book ai didi

java - 在类外覆盖 Object#equals(Object)

转载 作者:太空狗 更新时间:2023-10-29 22:44:13 25 4
gpt4 key购买 nike

是否可以覆盖 Object#equals(Object)在本地使用 list.contains(someObject)

示例:

class SomeObject {
...
private int id;
private String name;

@Overrdide
public boolean equals(Object other){
...
return this.id == other.id;
}
}

但是,如果我在使用 list.contains(someObject) 时想要另一种 equals 怎么办? ?例如我想知道一个列表是否包含某个名字?是否可以覆盖 Object#equals(Object) “匿名”?

更具体的解释为什么我需要它:

int objectId = ... // Some event which passes me the attribute of an object but not the object itself

现在我有 List<SomeObject> someObjects我想知道这个列表是否包含带有 objectId 的对象无需对其进行迭代。

我能想到的一个“解决方案”是使用 Map<Integer, SomeObject> mapping然后 someObject = mapping.get(objectId)

编辑:我的问题不是重复的,因为我特别要求覆盖 Object#equals(Object) .

最佳答案

您可以对从列表中获得的流对象应用过滤器。过滤器采用谓词,您可以在其中设置条件。然后你可以检查过滤后的流是否不为空:

list.stream().filter(e -> e.name.equals(otherName)).findAny().isPresent()

您可以使其可重复使用,例如:

private <T> boolean containsWithPredicate(List<T> list, Predicate<T> predicate) {
return list.stream().filter(predicate).findAny().isPresent();
}

并按如下方式调用它:

boolean containsElement = containsWithPredicate(myListOfObjects,
(e -> e.name.equals(otherName)));

编辑:

有一种更简单的方法可以通过调用 Stream.anyMatch 来完成与上面完全相同的操作。而不是执行 filter 然后执行 findAny:

list.stream().anyMatch(predicate);

关于java - 在类外覆盖 Object#equals(Object),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36200320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com