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<String>
并且名称可以匹配列表中的任何元素时有效。像这样的:
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<String>
(因为关键字是字符串,getKeywordList()
返回ArrayList<String>
)
谢谢!
【问题讨论】:
【参考方案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 -> o.getKeywordList().contains(keywordList))
不起作用..
@S.O.S 在这种情况下您可以使用.containsAll(keywordList)
(假设您要检查所有关键字是否存在)
但如果列表中的任何一个关键字匹配,我希望它返回 true。我相信 containsAll(keywordList)
只有在所有匹配时才会返回 true。正确吗?
@S.O.S 没错(这就是我添加 ...假设... 的原因)。如果您想检查列表是否包含至少一个关键字,您可以使用return list.stream().anyMatch(o -> o.getKeywordList().stream().anyMatch(o::equals));
(请注意空列表,因为如果流为空,anyMatch
返回true
- 我认为)
感谢您到目前为止的回复。只是想澄清一件事:return list.stream().anyMatch(o -> o.getKeywordList().stream().anyMatch(o::equals));
这会评估 List 中的KeywordPOJO
是否包含任何包含来自keywordList
(参数)的任何关键字的对象?该方法将接受以下参数:final List<KeywordPOJO> list, final ArrayList<String> keywordList
以上是关于Java List.contains(ArrayList<String> 字段值等于 x)的主要内容,如果未能解决你的问题,请参考以下文章