Java 9中的takeWhile()与filter()有何不同?它有什么额外的实用程序?
Stream.of(1,2,3,4,5,6,7,8,9,10).filter(i -> i < 4 )
.forEach(System.out::println);
这也许是下面所要做的
Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i < 4 )
.forEach(System.out::println);
那么这个新功能的需求是什么呢?
5条答案
按热度按时间gz5pxeao1#
filter
将从流中移除不满足条件的所有项目。takeWhile
将在第一次出现不满足条件的项时中止流。例如:
将打印
123321
但是
将打印
123
4ngedf3f2#
区别
休息一会儿
在过滤器为true时获取值,然后停止
滤器
获取与过滤器匹配的所有值
示例
TIO
这将输出从2到10(含)的所有偶数。
TIO
它不输出任何内容,因为1不是偶数,所以它在输出任何内容之前停止。
yrdbyhpb3#
根据这篇博文:https://blog.codefx.org/java/java-9-stream/
在有序流上调用它将返回一个新的流,该流由通过 predicate 的元素组成直到第一个元素失败。它有点像filter,但它在第一个元素失败 predicate 时立即切断流。用它的说法,它在 predicate 保持时从流中获取元素,并在 predicate 不再保持时立即停止。
我把重要的东西用黑体标出。
帖子中的例子:
输出
abc
。因为它过滤直到第一个元素与 predicate 不匹配(在这个例子中是第4个元素)。所以你可以说它短路了这个流。41zrol4v4#
它可用于获取第一个
null
值的索引,例如:你可以对
filter
做同样的事情,但是在这种情况下,你需要一个条件,一旦你得到第一个空值,就打破过滤器,所以实际上filter
不适合这种工作,而takeWhile
正好适合这种情况。hvvq6cgz5#
如果您知道源是sorted,则操作takeWhile和dropWhile比过滤器更高效。这些操作使用短路,这意味着:计算在找到结果时停止,不需要使用过滤器操作处理整个流