【问题标题】:A list contains at least one value from another list (Java 8)一个列表至少包含另一个列表中的一个值(Java 8)
【发布时间】:2017-01-29 12:23:46
【问题描述】:

我的函数从列表中的给定单词列表中查找一个单词在页面中是否有效。 因此,当页面包含单词时,我将其编写如下: (简化版)

private boolean atLeastOneWordIsValidInThePage(Page page, Set<Long>  wordIdsToCheck) 
    Set<Long> wordIds = page.getWords().stream()
                .filter(word -> word.isValid())
                .map(word->getWordId())
                .collect(Collectors.toSet());
return words.stream().anyMatch((o) -> wordIds.contains(o));

编写它是最好的 java 8 实践吗?
我想在找到第一个匹配项时停止搜索。

【问题讨论】:

  • 我猜想将流收集到一个集合中必须与进行基于集合的查找具有相同的复杂性。所以我认为不需要构造wordIds
  • stackoverflow.com/questions/8708542/… 中有一些有趣的方法(只需滚动浏览所有答案)。

标签: java lambda java-8 java-stream


【解决方案1】:

无需打开两个单独的流。您应该能够将anyMatch 直接链接到map 函数,如下所示:

return page.getWords().stream()
            .filter(word -> word.isValid())
            .map(word->getWordId())
            .anyMatch((o) -> words.contains(o));

【讨论】:

  • 您甚至可以删除(o) -&gt; 并使用方法参考。
  • @PavelHoral 公平点。尽量保持代码接近 OP 代码。
  • 另外,关于map(缺少word.)的OP 代码中可能存在拼写错误……但这是问题的问题,而不是答案。
  • @PavelHoral 我没有遵循。 word 是 lambda 参数对吗?
  • 应该是word -&gt; word.getWordId()...但这必须得到OP的确认。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 2017-09-18
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
相关资源
最近更新 更多