Java List.contains(ArrayList<String> 字段值等于 x)

Posted

技术标签:

【中文标题】Java List.contains(ArrayList<String> 字段值等于 x)【英文标题】:Java List.contains(ArrayList<String> with field value equal to x) 【发布时间】:2020-05-15 16:21:09 【问题描述】:

使用下面的代码,我可以检查对象的 List 是否包含匹配特定值的字段。

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

但是,这仅在 o.getName() 返回 String 时有效。我正在尝试修改代码,以便在 MyObject 包含 ArrayList&lt;String&gt; 并且名称可以匹配列表中的任何元素时有效。像这样的:

public boolean containsKeyword(final List<KeywordPOJO> list, final String keyword)
    return list.stream().filter(o -> o.getKeywordList().equals(keyword)).findFirst().isPresent();

其中KeywordPOJO 返回一个关键字列表,而不是单个String。如果keyword 匹配这些关键字中的 ANY,则方法应返回 true。

目前,Eclipse 抛出警告:Unlikely argument type for equals(): String seems to be unrelated to ArrayList&lt;String&gt;(因为关键字是字符串,getKeywordList() 返回ArrayList&lt;String&gt;

谢谢!

【问题讨论】:

【参考方案1】:

尝试替换:

list.stream().filter(o -> o.getKeywordList().equals(keyword)).findFirst().isPresent();

作者:

list.stream().filter(o -> o.getKeywordList().contains(keyword)).findFirst().isPresent();

或更短:

list.stream().anyMatch(o -> o.getKeywordList().contains(keyword));

【讨论】:

【参考方案2】:

你可以简单地使用List.contains:

o -> o.getKeywordList().contains(keyword);

附带说明,您的表达可以简化为Stream.anyMatch

public boolean containsKeyword(final List<KeywordPOJO> list, final String keyword)
    return list.stream().anyMatch(o -> o.getKeywordList().contains(keyword));

【讨论】:

谢谢。如果keyword 实际上是List 而不是String 怎么办? list.stream().anyMatch(o -&gt; o.getKeywordList().contains(keywordList)) 不起作用.. @S.O.S 在这种情况下您可以使用.containsAll(keywordList)(假设您要检查所有关键字是否存在) 但如果列表中的任何一个关键字匹配,我希望它返回 true。我相信 containsAll(keywordList) 只有在所有匹配时才会返回 true。正确吗? @S.O.S 没错(这就是我添加 ...假设... 的原因)。如果您想检查列表是否包含至少一个关键字,您可以使用return list.stream().anyMatch(o -&gt; o.getKeywordList().stream().anyMatch(o::equals));(请注意空列表,因为如果流为空,anyMatch 返回true - 我认为) 感谢您到目前为止的回复。只是想澄清一件事:return list.stream().anyMatch(o -&gt; o.getKeywordList().stream().anyMatch(o::equals)); 这会评估 List 中的KeywordPOJO 是否包含任何包含来自keywordList(参数)的任何关键字的对象?该方法将接受以下参数:final List&lt;KeywordPOJO&gt; list, final ArrayList&lt;String&gt; keywordList

以上是关于Java List.contains(ArrayList<String> 字段值等于 x)的主要内容,如果未能解决你的问题,请参考以下文章

Java-List元素判断

Java-List元素判断

java用poi往excel里写数据遇到换行问题

java 判断元素是否在数组内

list.contains方法既然是调用equ 方法 还用重写 hashcod吗

list.contains