Java 8 和 11 之间的流差异
Stream difference between Java 8 and 11
考虑这段代码:
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 -> {});
}
Java8中的输出:
1
1
1
2
2
2
并在 Java 11:
1
1
1
2
这是 Java 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);
懒惰在 flatMap
的情况下发生了变化,直到 java-10,flatMap
从来没有懒惰过。见 JDK-8075939
Stream.flatMap( )
causes breaking of short-circuiting of terminal operations -
这是一个从 Java 10.
开始修复的错误
这不是错误,而是使 flatMap
在惰性模式下工作的优化。
我能看到的一个漂亮的功能改进,因为现在我可以以 Lazy 方式使用 flatMap
, 几乎完全支持 功能组合 而不是 只是一个函数执行链( 如果不是懒惰 )。
当我开始写 NEW Java 代码时,函数式组合是我每天真正兴奋的地方。
也许我迟到了..!! :P
考虑这段代码:
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 -> {});
}
Java8中的输出:
1
1
1
2
2
2
并在 Java 11:
1
1
1
2
这是 Java 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);
懒惰在 flatMap
的情况下发生了变化,直到 java-10,flatMap
从来没有懒惰过。见 JDK-8075939
Stream.flatMap( )
causes breaking of short-circuiting of terminal operations -
这是一个从 Java 10.
开始修复的错误这不是错误,而是使 flatMap
在惰性模式下工作的优化。
我能看到的一个漂亮的功能改进,因为现在我可以以 Lazy 方式使用 flatMap
, 几乎完全支持 功能组合 而不是 只是一个函数执行链( 如果不是懒惰 )。
当我开始写 NEW Java 代码时,函数式组合是我每天真正兴奋的地方。
也许我迟到了..!! :P