Scala Stream 与 Java Stream 懒惰差异
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 的行为对我来说似乎更合理,因为流被延迟评估并且
我没有收集或尝试打印结果。但在 Scala 中,即使我没有使用流,它也会打印出一些信息。所以我的问题是造成这种差异的原因是什么?
这是因为 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。
我是懒惰求值概念的新手。当我在 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 中,即使我没有使用流,它也会打印出一些信息。所以我的问题是造成这种差异的原因是什么?
这是因为 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。