Scala Stream与Java Stream Laziness的区别

时间:2017-01-20 12:58:10

标签: java scala java-8 java-stream lazy-evaluation

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

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

打印出来:

n:1
n:2
n:3

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

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

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

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

1 个答案:

答案 0 :(得分:11)

这是因为filter并非完全懒惰。它有这段代码:

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

导致Stream的实现和实际过滤。

如果您想要完全懒惰,请使用withFilter

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

有关详情,请参阅withFilter instead of filter