Java 8和11之间的流差异[重复]

问题描述 投票:15回答:3

考虑以下代码:

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
3个回答
6
投票

flatMap的情况下,懒惰已经改变,直到java-10,flatMap从未懒惰。见JDK-8075939


9
投票

0
投票

这不是一个错误,而是使flatMap在惰性模式下工作的优化。

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

当我开始编写新的Java代码时,功能组合每天都让我感到非常兴奋。

也许我迟到了。!! :P

© www.soinside.com 2019 - 2024. All rights reserved.