【问题标题】:Java List.contains(ArrayList<String> with field value equal to x)Java List.contains(ArrayList<String> 字段值等于 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;

谢谢!

【问题讨论】:

    标签: java list search contains


    【解决方案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
      猜你喜欢
      • 2017-08-30
      • 1970-01-01
      • 2018-08-05
      • 2016-10-22
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      相关资源
      最近更新 更多