Java 流 sorted() 行为取决于下一次 takeWhile() 调用

Muk*_*t09 4 java jvm java-stream

我正在练习流。然后得到了这种奇怪的行为。我想不通原因。这就是为什么寻求帮助。

我是这样写的:

IntStream.iterate(10, i -> i - 2)
            .limit(5)
            .sorted()
            .takeWhile(i -> i > 2)
            .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

这在控制台中没有给我任何信息,这是预期的。当我在 IntelliJ IDEA 中看到流链时,得到:

在此处输入图片说明

因此,在执行sorted()后,它只向管道返回一个元素(该元素在图像中为 2)。

现在我评论了takeWhile()调用。像这样:

IntStream.iterate(10, i -> i - 2)
            .limit(5)
            .sorted()
        //    .takeWhile(i -> i > 2)
            .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

这也按预期在控制台中打印(从 10 到 2,相差 2)。

但问题是,这次sorted()向管道返回了 5 个元素。当我在 IntelliJ IDEA 中看到流链时,得到:

在此处输入图片说明

我的问题是,为什么在调用sorted() 时会看到差异?如果sorted()之后有takeWhile( )则它返回一个元素。如果我评论takeWhile()sorted()将返回 5 个元素的流。

JVM 是否在这里做任何事情来获得更好的性能?

提前致谢.....

THe*_*rOX 8

Stream.sorted()是有状态的操作,所以实际上是在维护[2, 4, 6, 8, 10]状态。但是,它一次只会发送 1 个项目

所以,最初,它会发送1项:'2'takeWhile运营商则可以拒绝入境并停止流链。这就是为什么您看到 sorted 仅返回2takeWhileoperator。

但是,当 sorted 不存在时,takeWhile10作为条目获取。并且当条件为真时,流将继续直到takeWhile接收2

编辑:当takeWhile不存在时,您将获得所有 5 个项目作为输出,因为您在流链中有 5 个项目并且没有takeWhile停止流链。

在 Intellij 的 Stream Trace 中,在 sorted 的右侧,您会看到执行sorted()操作后有多少元素被传递给 next 运算符。

在第一种情况下,仅1元件被传递到takeWhile()takeWhile()在接收之后终止流链'2'。但在第二种情况下,所有元素都被传递给forEach.