Java takeWhile与过滤器有何不同?

Java takeWhile与过滤器有何不同?,java,java-stream,java-9,Java,Java Stream,Java 9,takeWhile()与Java9中的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).过滤器(i->iiii

takeWhile()与Java9中的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).过滤器(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);
Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i->i<4)
.forEach(System.out::println);

那么这个新函数需要什么呢?

过滤器将从流中删除所有不满足条件的项

takeWhile
将在第一次出现不满足条件的项时中止流

e、 g

Stream.of(1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1)
.过滤器(i->i<4)
.forEach(系统输出::打印);
将打印

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(系统输出::打印);
将打印

123


根据这篇博文:

有序流调用它将返回一个新的流,该流由通过谓词的元素组成,直到第一个元素失败为止。它有点像filter,但是当第一个元素失败时,就会切断流。用它的说法,它从流中获取元素,而谓词保留并在不再保留时立即停止

我用粗体标出了重要的东西

文章中的例子如下:

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

输出
abc
。因为它会一直过滤到第一个元素与谓词不匹配为止(在示例中是第四个元素)。因此,您可以说它正在对流进行短路。

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

Stream.of("Test", "Test2", null, "Test2", null).takeWhile(Objects:isNull).count();
您可以对
过滤器执行相同的操作,但在这种情况下,您需要有一个条件,以便在获得第一个空值时立即中断过滤器。因此,实际上,
filter
不适合这种工作,而
takeWhile
恰恰适合这种情况。

不同之处在于 花时间 在筛选器为true时获取值,然后停止

滤波器 获取与筛选器匹配的所有值

例子

这将输出从2到10(包括2到10)的所有偶数

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


这不会输出任何内容,因为1不是偶数,因此在输出任何内容之前它会停止。

如果知道源已排序,则操作takeWhiledropWhile比过滤器更有效。这些操作利用了短路,这意味着:当发现结果时,计算停止,不需要使用过滤操作处理整个流对有序流调用时,它将返回一个新的流,该流由传递谓词的元素组成,直到第一个元素失败。它有点像过滤器,但一旦第一个元素使谓词失败,它就会切断流。按照它的说法,它从流中获取元素,而谓词保持并在不再保持时立即停止。”-如果您将谓词更改为仅获取奇数元素
filter()
,将导致
1,3,5,7,9
takeWhile()
只会产生
1
。好吧。所以它可能是
过滤器的一种更为狭窄的形式。事实上,这就是为什么在函数名中有
表示如果谓词不成立,则表示
中断的原因。你明白了:)…喜欢链接!非常方便将来参考并可能在这里使用。这些操作rs
take*,skip*
结束可观察的订阅并取消订阅?就像
take(1)
那样?这不一定成立。
Stream.of("Test", "Test2", null, "Test2", null).takeWhile(Objects:isNull).count();
Stream.of(1,2,3,4,5,6,7,8,9,10).filter(i -> i % 2 == 0 )
    .forEach(System.out::println);
Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i % 2 == 0 )
    .forEach(System.out::println);