Java中流的惰性评估:流已被操作或关闭

Java中流的惰性评估:流已被操作或关闭,java,java-8,java-stream,Java,Java 8,Java Stream,根据Java8API,对流进行惰性评估。我有以下代码片段: List<String> l = Arrays.asList("d", "dw", "ew", "jj", "hh"); //Line 1 Stream<String> ls=l.stream(); //Line 2 ls.map(a->a+"e"); //Li

根据Java8API,对流进行惰性评估。我有以下代码片段:

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
当我用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行的
map
调用将
ls
上的
linkedorconsumered
标志设置为true。 这导致第4行出现错误


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

显然,第3行已经使用了
,因此它在第4行中不再可用。。。
(在Java中)与
列表
(在Scala中)的迭代不可比较。
流#映射
返回一个新的
<代码>ls.map(a->a+“e”)应该是
ls=ls.map(a->a+“e”)@deHaar-请再次检查我的代码…它不是地图。它是a.iterator.map
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"