【发布时间】: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返回一个新的Stream;ls.map(a->a+"e");应该是ls = ls.map(a -> a + "e"); -
@deHaar - 请再次检查我的代码...它不是 a.map。它的 a.iterator.map
标签: java java-8 java-stream