【问题标题】:Stream difference between Java 8 and 11 [duplicate]Java 8和11之间的流差异[重复]
【发布时间】:2019-03-15 11:09:03
【问题描述】:

考虑这段代码:

public static void main(String[] args) {
    Stream.iterate(1, i -> i + 1)
            .flatMap(i -> Stream.of(i, i, i))
            .peek(System.out::println)
            .limit(4)
            .forEach(i -> {});
}

Java 8 中的输出:

1
1
1
2
2
2

在 Java 11 中:

1
1
1
2

这是 Java 8 中的错误或预期行为,在 11 中已更改?

上述代码只是演示不同行为的示例,但更严重的差异意味着以下代码在 Java 11 中打印 1,2,3 但在 Java 8 中进入无限循环:

    Stream.iterate(0, i -> i + 10)
            .flatMap(i -> Stream.iterate(i + 1, j -> j + 1))
            .limit(3)
            .forEach(System.out::println);

【问题讨论】:

    标签: java java-8 java-stream java-11 flatmap


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      flatMap 的懒惰已经改变,直到 java-10,flatMap 从来没有懒惰。见JDK-8075939

      【讨论】:

        【解决方案3】:

        使flatMap 在惰性模式下工作不是错误而是优化。

        我可以看到一个漂亮的功能改进,因为现在我可以以 Lazy 方式使用 flatMap几乎完全支持 功能组合,而不是 只是一个函数执行链(如果不是懒惰)。

        当我开始编写 Java 代码时,每天真正让我兴奋的是函数式组合。

        也许我迟到了……!! :P

        【讨论】:

          猜你喜欢
          • 2021-05-25
          • 2011-06-01
          • 2021-08-19
          • 1970-01-01
          • 2012-11-21
          • 2012-12-16
          • 1970-01-01
          • 1970-01-01
          • 2018-07-24
          相关资源
          最近更新 更多