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

标签 java jvm java-stream

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

IntStream.iterate(10, i -> i - 2)
            .limit(5)
            .sorted()
            .takeWhile(i -> i > 2)
            .forEach(System.out::println);
这在控制台中没有给我任何东西,这是预期的。当我在 IntelliJ IDEA 中看到流链时,得到以下信息:
enter image description here
所以,在 执行后排序() 它仅将一个元素(该元素在图像中为 2)返回到管道。
现在我评论了 takeWhile() 称呼。像这样:
IntStream.iterate(10, i -> i - 2)
            .limit(5)
            .sorted()
        //    .takeWhile(i -> i > 2)
            .forEach(System.out::println);
这也按预期在控制台中打印(从 10 到 2,差异为 2)。
但问题是,这一次 排序() 将 5 个元素返回到管道。当我在 IntelliJ IDEA 中看到流链时,得到以下信息:
enter image description here
我的问题是,为什么在调用 时会出现差异?排序() ?如果有 takeWhile() 之后 排序() 然后它返回一个元素。如果我在评论 takeWhile() , 排序() 正在返回 5 个元素的流。
JVM 在这里做了什么来获得更好的性能吗?
提前致谢.....

最佳答案

Stream.sorted()是有状态的操作,所以它实际上是在维护 [2, 4, 6, 8, 10]状态。 但是,它一次只会发送 1 个项目 .
因此,最初它将发送 1 个条目:'2'takeWhile然后可以拒绝条目并停止流链的运算符(operator)。这就是为什么您看到 sorted 仅返回 2takeWhile运算符(operator)。
但是,当 sorted 不存在时,takeWhile将获得 10作为入口。当条件为真时,流将持续到 takeWhile接收 2 .
编辑:
takeWhile不存在,您将获得所有 5 个项目作为输出,因为您在流链中有 5 个项目并且没有 takeWhile停止流链。
在 Intellij 的 Stream Trace 中,在 sorted 的右侧,您可以看到在执行 sorted() 后有多少元素被传递给 next 运算符。手术。
在第一种情况下,只有一个元素被传递给 takeWhile()takeWhile()接收到 '2' 后正在终止流链.但在第二种情况下,所有元素都被传递给 forEach .

关于Java 流 sorted() 行为取决于下一个 takeWhile() 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63546583/

相关文章:

java - 构造函数中令人困惑的 Java 分配引用

java-8 - Java 8 Stream 可以将数据分派(dispatch)给其他方法吗?

java - 从 Eclipse RCP 中的向导调用复杂操作的正确方法是什么?

java - RESTful 服务的自动类生成器

java - NV21 到 RGB 转换结果为黑白

c# - 静态方法与单例

java - 当 JVM 达到一定的堆大小时,如何停止 Camel 路由?

java - 跟踪垃圾收集

Java 8 使用过滤器选项在嵌套列表中执行求和运算

java - 使用 anyMatch 的流中的空安全