怎么跟过滤器有什么不同?

时间:2017-10-20 13:57:09

标签: java java-stream java-9

takeWhile()与Java 9中的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 个答案:

答案 0 :(得分:13)

filter将从流中删除不满足条件的所有项目。

takeWhile将在第一次出现不符合条件的项目时中止流。

e.g。

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

答案 1 :(得分:3)

差异

takeWhile

过滤器为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不是偶数,所以在输出任何内容之前它会停止。

答案 2 :(得分:2)

根据这篇博文:https://blog.codefx.org/java/java-9-stream/

  

有序流上调用它将返回一个新元素,该元素由传递谓词的元素组成,直到第一个失败。它有点像过滤器,但是当第一个元素失败谓词时,它会切断流。用它来说,它从流中获取元素,而谓词一旦不再存在就停止并停止。

我用粗体标记了重要的东西。

帖子中的例子:

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

输出abc。因为它会过滤直到第一个与谓词不匹配(在示例中为第4个元素)。所以你可以说它将流短路。

答案 3 :(得分:1)

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

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

您可以对filter执行相同操作,但在这种情况下,您需要有条件在获得第一个空值后立即中断过滤器。因此,在实践中,filter不适用于此类工作,而takeWhile正是针对该情况。

答案 4 :(得分:-1)

如果您知道来源是已排序,则

takeWhile dropWhile 操作比过滤器更有效。这些操作利用了短路,这意味着:结果发现计算停止,因此无需使用过滤器操作处理整个流