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项。也许我不理解你的问题,但我认为你在这个问题上想得太多了。谢谢,伙计,我在上次编辑后明白了你的意思。我接受你的回答。