小编典典

Java List.contains(字段值等于 x 的对象)

all

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

就像是;

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

我知道上面的代码没有做任何事情,它只是为了大致展示我想要实现的目标。

另外,为了澄清,我不想使用简单循环的原因是因为此代码当前将进入循环内部的循环内部循环内部。为了可读性,我不想继续向这些循环添加循环。所以我想知道是否有任何简单的(ish)替代品。


阅读 102

收藏
2022-05-19

共1个答案

小编典典

如果您使用的是 Java 8,也许您可​​以尝试以下方法:

public boolean containsName(final List<MyObject> list, final String name){
    return list.stream().filter(o -> o.getName().equals(name)).findFirst().isPresent();
}

或者,您可以尝试这样的事情:

public boolean containsName(final List<MyObject> list, final String name){
    return list.stream().map(MyObject::getName).filter(name::equals).findFirst().isPresent();
}

true如果List<MyObject>包含MyObject带有名称的 a,则此方法将返回name。如果您想对每个MyObjects
that执行操作getName().equals(name),那么您可以尝试这样的操作:

public void perform(final List<MyObject> list, final String name){
    list.stream().filter(o -> o.getName().equals(name)).forEach(
            o -> {
                //...
            }
    );
}

whereo代表一个MyObject实例。

或者,正如评论所建议的(感谢 MK10),您可以使用以下Stream#anyMatch方法:

public boolean containsName(final List<MyObject> list, final String name){
    return list.stream().anyMatch(o -> o.getName().equals(name));
}
2022-05-19