Java 8 中如果计数大于某个值,如何提前终止流?

问题描述 投票:0回答:1

我有一个

Author
课。作者类包含一个名为
getBooks
的方法,该方法返回作者
List<Book>
撰写的书籍列表。

现在,我有了一批作者。如何检查书籍的总数是否大于某个 int 值

n
,而不迭代整个集合?

这就是我目前拥有的 -

return authors.stream().mapToInt(a -> a.getBooks().size()).sum() > n

java java-stream
1个回答
0
投票

allMatch()
是一个短路功能,所以你可以用它来停止加工。

主要缺点是你必须进行两次测试:一次是为了看看是否应该处理它,另一次是为了看看是否继续。

而且,此解决方案返回一个布尔值,因此您无法像平常那样收集流的结果,但也许在这种情况下它对您有用。

 boolean result = authors.stream()
            .flatMap(author -> author.getBooks().stream())
            .mapToInt(book -> 1)
            .peek(count -> {
                if (count < n) {
                    System.out.println(count);
                }
            })
            .allMatch(count -> count < n);

因为你提到它是针对java 8的,所以我不建议使用

takeWhile
,它是jdk9中添加的。但如果您有兴趣,也可以阅读: https://stackoverflow.com/a/46850795/12769096

© www.soinside.com 2019 - 2024. All rights reserved.