当前位置:  开发笔记 > 编程语言 > 正文

Scala Stream与Java Stream Laziness的区别

如何解决《ScalaStream与JavaStreamLaziness的区别》经验,为你挑选了1个好方法。

我是懒惰评估概念的新手.当我在Scala中执行这行代码时;

"12334".grouped(1).toStream.filter{n => println("n:" +n ); n=="3";}

打印出来:

n:1
n:2
n:3

但是当我在Java中运行类似的东西时,例如:

List myList = new ArrayList<>(Arrays.asList("12334".split("")));

Stream myList2 = myList.stream().filter(a -> {System.out.println("a:" +a);return "3".equals(a);});

它无声地终止,无需向控制台行写任何内容.Java的行为对我来说似乎更合理,因为Streams被懒惰地评估,我没有收集或尝试打印结果.但是在Scala中,即使我没有消耗流,它也会输出一些信息.所以我的问题是导致这种差异的原因是什么?



1> Yuval Itzcha..:

这是因为事实filter并非完全是懒惰的.它有这段代码:

while (!rest.isEmpty && !p(rest.head)) rest = rest.tail

这导致了物化和实际过滤Stream.

如果你想要完全懒惰,请选择withFilter:

"12334".grouped(1).toStream.withFilter { n => println("n:" +n ); n=="3"; }

有关详细信息,请参阅withFilter而不是filter.

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有