Java List.contains(Object with field value equal to x) Java列表.contains(字段值等于x的对象)

291

我想检查一个List是否包含一个具有特定值字段的对象。现在,我可以使用循环来遍历并检查,但我很好奇是否有更高效的代码方式。

类似于:

if(list.contains(new Object().setName("John"))){
    //Do some stuff
}

我知道上面的代码没有任何作用,只是为了粗略地演示我所想要实现的内容。

另外,为了澄清,我不想使用简单循环的原因是,这段代码目前将进入一个嵌套循环中,该嵌套循环又位于另一个嵌套循环内部。为了可读性,我不想在这些循环中添加循环。因此,我想知道是否有任何简单的替代方法。


6
由于这是自定义相等性,您将需要编写自定义代码。 - Sotirios Delimanolis
你所说的目标和代码示例似乎不匹配。你只想根据一个字段值比较对象吗? - Duncan Jones
1
你想覆盖自定义对象的 equals(Object) 方法吗? - Josh M
1
for(Person p:list) if (p.getName().equals("John") return true; return false;很抱歉,在Java中您不会找到更简洁的方法。 - MikeFHay
@Rajdeep 抱歉,我不理解你的问题。p.equals(p) 应该总是为真,所以我不明白你想要实现什么。希望如果你提出一个新问题,你可以得到更好的帮助。 - MikeFHay
14个回答

3

contains 方法内部使用 equals。因此,您需要根据需要重写类的 equals 方法。

顺便提一句,这看起来语法上不正确:

new Object().setName("John")

3
除非setter方法返回this - Sotirios Delimanolis
那么,如果我覆盖了添加到列表中的自定义对象的equals方法...如果某些类变量相同,我能让它只返回true吗? - Rudi Kershaw
@RudiKershaw 是的,那就是我们的想法,你可以根据一个、两个或所有字段返回 true。所以,如果你认为逻辑上讲,同名的两个对象是相等的对象,那么只需比较名称就返回 true。 - Juned Ahsan
2
除非对于该类来说有意义,否则不建议为单个用例覆盖equals。最好只编写循环。 - MikeFHay
@MikeFHay同意,这就是为什么我在评论中提到“因此,如果您认为逻辑上正确的说法是具有相同名称的两个对象是相等的对象,则返回true”。 - Juned Ahsan

1
如果您需要重复执行此List.contains(具有字段值等于x的对象)操作,一个简单而有效的解决方法是:
List<field obj type> fieldOfInterestValues = new ArrayList<field obj type>;
for(Object obj : List) {
    fieldOfInterestValues.add(obj.getFieldOfInterest());
}

然后,List.contains(Object with field value equal to x) 的结果将与 fieldOfInterestValues.contains(x); 相同。

0

尽管有JAVA 8 SDK,但还有许多集合工具库可帮助您处理,例如:http://commons.apache.org/proper/commons-collections/

Predicate condition = new Predicate() {
   boolean evaluate(Object obj) {
        return ((Sample)obj).myField.equals("myVal");
   }
};
List result = CollectionUtils.select( list, condition );

-1

试试这个:

list.stream().filter(req -> 
req.getName().equals("John")).findFirst().isPresent()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接