Scala流和Java流的惰性差异

14

我对惰性求值的概念还不熟悉。当我在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的行为更合理,因为流是惰性求值的,我没有收集或尝试打印结果。但是在Scala中,即使我没有使用流,它也会打印出一些信息。那么我的问题是是什么导致这种差异?

1个回答

13

这是因为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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接