java takeWhile与filter有何不同?

9lowa7mx  于 2023-02-02  发布在  Java
关注(0)|答案(5)|浏览(433)

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);

那么这个新功能的需求是什么呢?

gz5pxeao

gz5pxeao1#

filter将从流中移除不满足条件的所有项目。
takeWhile将在第一次出现不满足条件的项时中止流。
例如:

Stream.of(1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1)
    .filter(i -> i < 4 )
    .forEach(System.out::print);

将打印
123321
但是

Stream.of(1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1)
    .takeWhile(i -> i < 4 )
    .forEach(System.out::print);

将打印
123

4ngedf3f

4ngedf3f2#

区别

休息一会儿

在过滤器为true时获取值,然后停止

滤器

获取与过滤器匹配的所有值

示例

Stream.of(1,2,3,4,5,6,7,8,9,10).filter(i -> i % 2 == 0 )
    .forEach(System.out::println);

TIO
这将输出从2到10(含)的所有偶数。

Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i % 2 == 0 )
    .forEach(System.out::println);

TIO
它不输出任何内容,因为1不是偶数,所以它在输出任何内容之前停止。

yrdbyhpb

yrdbyhpb3#

根据这篇博文:https://blog.codefx.org/java/java-9-stream/
有序流上调用它将返回一个新的流,该流由通过 predicate 的元素组成直到第一个元素失败。它有点像filter,但它在第一个元素失败 predicate 时立即切断流。用它的说法,它在 predicate 保持时从流中获取元素,并在 predicate 不再保持时立即停止。
我把重要的东西用黑体标出。
帖子中的例子:

Stream.of("a", "b", "c", "", "e")
    .takeWhile(s -> !String.isEmpty(s));
    .forEach(System.out::print);

输出abc。因为它过滤直到第一个元素与 predicate 不匹配(在这个例子中是第4个元素)。所以你可以说它短路了这个流。

41zrol4v

41zrol4v4#

它可用于获取第一个null值的索引,例如:

Stream.of("Test", "Test2", null, "Test2", null).takeWhile(Objects:isNull).count();

你可以对filter做同样的事情,但是在这种情况下,你需要一个条件,一旦你得到第一个空值,就打破过滤器,所以实际上filter不适合这种工作,而takeWhile正好适合这种情况。

hvvq6cgz

hvvq6cgz5#

如果您知道源是sorted,则操作takeWhiledropWhile比过滤器更高效。这些操作使用短路,这意味着:计算在找到结果时停止,不需要使用过滤器操作处理整个流

相关问题