我有一个
Author
课。作者类包含一个名为 getBooks
的方法,该方法返回作者 List<Book>
撰写的书籍列表。
现在,我有了一批作者。如何检查书籍的总数是否大于某个 int 值
n
,而不迭代整个集合?
这就是我目前拥有的 -
return authors.stream().mapToInt(a -> a.getBooks().size()).sum() > n
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