Java 8 和 11 之间的流差异

2022-09-02 21:56:14

请考虑以下代码:

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 中的 bug 或预期行为,在 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);

答案 1

Stream.flatMap( ) 导致终端操作短路中断 -

这是一个从Java 10开始修复的错误。


答案 2

懒惰已经发生了变化,直到java-10,从来没有懒惰。请参阅 JDK-8075939flatMapflatMap


推荐