Java中流的惰性评估:流已被操作或关闭
根据Java8API,对流进行惰性评估。我有以下代码片段: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
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"