【问题标题】:Lazy evaluation of streams in Java: stream has already been operated upon or closed [duplicate]Java中流的延迟评估:流已经被操作或关闭[重复]
【发布时间】:2019-11-14 14:56:48
【问题描述】:

根据 Java 8 API 和 this ,流被延迟评估。我有以下代码sn-p:

List<String> l = Arrays.asList("d", "dw", "ew", "jj", "hh"); //Line 1
Stream<String> ls=l.stream();                                //Line 2
ls.map(a->a+"e");                                            //Line 3
ls.map(a->a+"de").foreach(System.out::println);              //Line 4

如果流是惰性的,那么,在我的理解中,ls.map 应该返回一个新的流,即第 3 行和第 4 行,而无需真正评估 lambda。当我运行这段代码时,以下是第 4 行的输出指向错误:

Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed 

当我在 Scala 中使用同样惰性的迭代器重复此练习时。我没有收到此类错误:

val a = List(1,2,3,4);
res1=a.iterator;    //Iterator[Int] = non-empty iterator
res2=res1.map(_+1); //Iterator[Int] = non-empty iterator
res3=res1.map(_+1); //Iterator[Int] = non-empty iterator
res3.foreach(println) //1,2,3,4
res2.foreach(println) //no output as the iterator has "traversedonce"

不管我与 Scala 的比较如何,我的基本重点是声称的懒惰。当谈到 Java 的 Streams 的惰性实现时,我是否遗漏了什么?

【问题讨论】:

  • 显然,第 3 行已经消耗了 Stream,因此它在第 4 行中不再可用...Stream(在 Java 中)无法与 List 的迭代相提并论(在 Scala 中)。
  • Stream#map 返回一个新的Streamls.map(a-&gt;a+"e"); 应该是 ls = ls.map(a -&gt; a + "e");
  • @deHaar - 请再次检查我的代码...它不是 a.map。它的 a.iterator.map

标签: java java-8 java-stream


【解决方案1】:

第 3 行的 map 调用将 ls 上的 linkedOrConsumed 标志设置为 true。 这会导致第 4 行的错误。

即使操作尚未发生,Java 显然也不允许您重新定义要对流执行的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多