簡體   English   中英

Scala Stream與Java Stream Laziness的區別

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM