[英]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中,即使我沒有消耗流,它也會輸出一些信息。 所以我的問題是導致這種差異的原因是什么?
這是因為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 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.