当前位置: 首页 > 知识库问答 >
问题:

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

左丘兴生
2023-03-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 -> {});
}

Java8中的输出:

1
1
1
2
2
2

在Java 11中:

1
1
1
2

这是第8Java中的错误还是在第11Java中改变的预期行为?

上面的代码只是一个演示不同行为的示例,但更严重的区别是,以下代码在Java11中打印1,2,3,但在Java8中进入无限循环:

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

共有3个答案

贾骏
2023-03-14

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

我可以看到的一个漂亮的特性改进,现在我可以以Lazy的方式使用flatMap,几乎完全支持函数组合,而不仅仅是函数执行链(如果不是Lazy的话)。

当我开始编写新Java代码时,函数式组合每天都让我兴奋不已。

也许我参加聚会迟到了…!!:P

柴亦
2023-03-14

懒惰在< code>flatMap的情况下有所改变,直到java-10,< code>flatMap从来没有懒惰过。见JDK-8075939

苍意智
2023-03-14

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

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

 类似资料:
  • 我注意到以下代码在netbeans中是完全合法的: 然而eclipse对此并不满意,我必须这样初始化它: 有趣的是netbean建议不要在初始化部分指定类型参数,而是使用菱形运算符??我想知道这两种方法之间的区别。以及应该使用哪一种,这样代码就可以在不同的IDE中使用而不会有任何变化。

  • 我想知道更多处理数组的numpy。我发现a[:,None]和a[:,]之间是不同的。我想深入研究何时何地使用它们。 我试图以特殊的方式解决从2d数组中减去1d的问题,就像numpy-subtract-add-1d-array-from-2d-array一样,我意识到a[:,None]和a[:,]是不同的。 有人能给我关于它的官方或具体参考吗?我真的会很感激你的!

  • 发送表单数据时使用命令名称和模型属性有什么区别? 和 我应该在哪个时间点使用它们中的任何一个?

  • 可能重复: 何时使用LinkedList 我应该什么时候使用arrayList,什么时候使用LinkedList? 什么时候应该使用,和?

  • Java8流与RxJava可观测数据类似吗? Java 8流定义:

  • 问题内容: 很快就有两个相等运算符:double equals( )和Triple equals( ),两者之间有什么区别? 问题答案: 简而言之: 操作员检查其实例值是否相等, 操作员检查引用是否指向同一实例, 长答案: 类是引用类型,可能有多个常量和变量在幕后引用类的同一单个实例。类引用保留在运行时堆栈(RTS)中,其实例保留在内存的堆区域中。当您控制平等时, 这意味着它们的实例是否彼此相等。