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

Java stream sorted()行为取决于下一次takeWhile()调用,java,jvm,java-stream,Java,Jvm,Java Stream,我在练习溪流。然后有了这种奇怪的行为。我想不出原因。这就是为什么要寻求帮助 我写道: IntStream.iterate(10, i -> i - 2) .limit(5) .sorted() .takeWhile(i -> i > 2) .forEach(System.out::println); 这是给我什么在控制台,这是预期的。当我看到IntelliJ IDEA中的流链时,得

我在练习溪流。然后有了这种奇怪的行为。我想不出原因。这就是为什么要寻求帮助

我写道:

IntStream.iterate(10, i -> i - 2)
            .limit(5)
            .sorted()
            .takeWhile(i -> i > 2)
            .forEach(System.out::println);
这是给我什么在控制台,这是预期的。当我看到IntelliJ IDEA中的流链时,得到以下信息:

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

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

IntStream.iterate(10, i -> i - 2)
            .limit(5)
            .sorted()
        //    .takeWhile(i -> i > 2)
            .forEach(System.out::println);
这也会按预期在控制台中打印(从10到2,相差2)

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

我的问题是,为什么调用sorted()会有区别?如果在排序后有一个takeWhile(),则返回一个元素。如果我在评论takeWhile()sorted()将返回5个元素的流

JVM在这里做了什么来获得更好的性能吗

提前感谢….

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

因此,最初它将向
takeWhile
操作员发送一个条目:
'2'
,然后操作员可以拒绝该条目并停止流链。这就是为什么您看到排序只返回
2
takeWhile
操作符的原因

但是,当排序不存在时,
takeWhile
将获得
10
作为条目。当条件为真时,流将继续,直到
takeWhile
接收到
2

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

在Intellij的流跟踪中,在sorted的右侧,您可以看到在执行
sorted()
操作后,有多少元素被传递给下一个操作符


在第一种情况下,只有1个元素被传递到
takeWhile()
,因为
takeWhile()
在接收到
'2'
后终止流链。但是在第二种情况下,所有元素都被传递到
forEach

您能检查一下最后一段吗?排序()始终存在。我在第二段代码中注释了takeWhile()@如果没有
takeWhile
,则您将获得所有5项。也许我不理解你的问题,但我认为你在这个问题上想得太多了。谢谢,伙计,我在上次编辑后明白了你的意思。我接受你的回答。