Java 8和11之间的流差异

时间:2019-03-15 11:09:04

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

考虑以下代码:

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);

3 个答案:

答案 0 :(得分:9)

Stream.flatMap( ) causes breaking of short-circuiting of terminal operations-

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

答案 1 :(得分:6)

flatMap情况下,

懒惰发生了变化,直到java-10为止,flatMap从来都不是懒惰。参见JDK-8075939

答案 2 :(得分:0)

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

我可以看到的一项美丽的功能改进,因为现在我可以以懒惰的方式使用flatMap,并且几乎完全支持功能组合 ,而不是< em>只是功能执行链(如果不是很懒)。

当我开始编写 NEW Java代码时,功能组合才是真正使我兴奋的一天。

也许我聚会晚了.. !! :P