Scala Stream vs Java Stream Laziness Difference

我对懒惰评估的概念很陌生。当我在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

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

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

这会导致 .Stream

如果你想要完全懒惰,那就去:withFilter

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

有关详细信息,请参阅使用筛选器而不是筛选器


答案 2