Java 流 sorted() 行为取决于下一个 takeWhile() 调用
Java stream sorted() behavior is depending on next takeWhile() calling
我在练流。然后得到了这种奇怪的行为。我想不通原因。这就是寻求帮助的原因。
我写了这个:
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() 时会出现差异?如果在 sorted() 之后有一个 takeWhile() 那么它返回一个元素。如果我评论 takeWhile(),sorted() 返回 5 个元素的流。
JVM 是否在此处做任何事情以实现更好的性能?
提前致谢......
Stream.sorted()
是一个有状态的操作,所以它实际上是在维护[2, 4, 6, 8, 10]
状态。 但是,它一次只会发送 1 个项目。
因此,最初它将发送 1 个条目:'2'
到 takeWhile
运算符,然后运算符可以拒绝该条目并停止流链。这就是为什么您看到 sorted 仅将 2
返回给 takeWhile
运算符。
但是,当 sorted 不存在时,takeWhile
将获得 10
作为条目。当条件为真时,流将继续,直到 takeWhile
接收到 2
.
编辑:
当 takeWhile
不存在时,您将获得所有 5 个项目作为输出,因为您在流链中有 5 个项目并且没有 takeWhile
来停止流链。
在 Intellij 的 Stream Trace 中,在排序的右侧,您会看到在执行 sorted()
操作后有多少元素被传递给下一个运算符。
在第一种情况下,只有一个元素被传递给 takeWhile()
,因为 takeWhile()
在接收到 '2'
后终止流链。但在第二种情况下,所有元素都被传递给 forEach
.
我在练流。然后得到了这种奇怪的行为。我想不通原因。这就是寻求帮助的原因。
我写了这个:
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() 时会出现差异?如果在 sorted() 之后有一个 takeWhile() 那么它返回一个元素。如果我评论 takeWhile(),sorted() 返回 5 个元素的流。
JVM 是否在此处做任何事情以实现更好的性能?
提前致谢......
Stream.sorted()
是一个有状态的操作,所以它实际上是在维护[2, 4, 6, 8, 10]
状态。 但是,它一次只会发送 1 个项目。
因此,最初它将发送 1 个条目:'2'
到 takeWhile
运算符,然后运算符可以拒绝该条目并停止流链。这就是为什么您看到 sorted 仅将 2
返回给 takeWhile
运算符。
但是,当 sorted 不存在时,takeWhile
将获得 10
作为条目。当条件为真时,流将继续,直到 takeWhile
接收到 2
.
编辑:
当 takeWhile
不存在时,您将获得所有 5 个项目作为输出,因为您在流链中有 5 个项目并且没有 takeWhile
来停止流链。
在 Intellij 的 Stream Trace 中,在排序的右侧,您会看到在执行 sorted()
操作后有多少元素被传递给下一个运算符。
在第一种情况下,只有一个元素被传递给 takeWhile()
,因为 takeWhile()
在接收到 '2'
后终止流链。但在第二种情况下,所有元素都被传递给 forEach
.