似乎Iterator和Stream都是懶惰的,並且允許你繼續返回元素到你心中的內容。兩者有什麼區別?Scala中迭代器和流之間的區別?
50
A
回答
42
流memoises和Iterator沒有。您可以多次遍歷相同的流並每次都得到相同的結果。另一方面,迭代器只能被遍歷一次。
18
它們都是用於訪問當前元素的構造,具有尚未知的其餘元素列表(懶惰尾部)。
Iterator
是一個勢在必行的構造,你只能遍歷一次。
Stream
是一個功能性構造。從理論上講,你可以多次遍歷它(和其他人提到的一樣,它不會重新計算已經計算好的部分),但是在實踐中,因爲Streams是無限的或者非常大的(這就是爲什麼你首先使用它)參考完整的流並沒有多大意義(你會遇到Out Of Memory非常容易)。
- 因此,你應該總是定義使用
def
流,從來沒有把它變成具有長壽命範圍的局部變量。 - 也有使用流編寫遞歸函數時微妙之處,
- 可以有一個事實,即Scala的
Stream
不在其頭部懶惰導致一些意外的行爲,像
一般是比較安全的心靈避免使用普通的Stream
s。替代品使用Scalaz的EphemeralStream
,它使用弱引用自動忽略未引用的部分,或使用Iteratees(另請參閱here)或something similiar。
+0
我很好奇:爲什麼EphemeralStream不是默認實現?您始終可以從數據沿襲(其功能語言)重建被遺忘的部分。這聽起來像是一個很大的設計缺陷。 – tribbloid 2017-05-08 22:01:05
相關問題
- 1. 輸入迭代器和只讀前向迭代器之間有什麼區別?
- 2. Java:迭代器和陣列列表之間的區別
- 3. Java枚舉和迭代器之間的區別
- 4. scala和java枚舉之間的區別
- 5. 方法迭代器和視圖之間有什麼區別?
- 6. smarty中的foreach和迭代之間的區別
- 7. JavaScript中循環的迭代器和生成器之間的區別
- 8. 迭代行與while和數組賦值之間的區別
- 9. 索引和迭代器的區別是?
- 10. 協議和代表之間的區別?
- 11. $ HOME和'〜'(代字號)之間的區別?
- 12. http_proxy,https_proxy和代理之間的區別?
- 13. Scala中的RegexpParsers,StandardTokenParsers和JavaTokenParsers之間的區別
- 14. Scala迭代器/流與已知大小
- 15. Boost單通迭代器和前向遍歷迭代器之間有什麼區別?
- 16. 在Scala中,樂趣_和樂趣之間的區別是什麼
- 17. Scala中f(a,b)和f(a)(b)之間的區別
- 18. Scala中的JsObject和JsValue之間有什麼區別?
- 19. 集合和容器之間的區別
- 20. 監視器和鎖之間的區別?
- 21. 'int'對象不可迭代和兩個代碼之間的區別?
- 22. 二叉搜索樹插入中迭代和遞歸之間的區別
- 23. Java:流和I/O流之間的區別解釋
- 24. '+ ='和'= +'之間的區別?
- 25. {!!之間的區別!!}和{{}}
- 26. ==和case之間的區別?
- 27. '#','%'和'$'之間的區別
- 28. | =和^ = css之間的區別
- 29. 「%〜dp0」和「。\」之間的區別?
- 30. .eq之間的區別。和==
關於記憶 - 如果我訪問第N個元素,是訪問時間O(1)還是O(N)? – ryeguy 2009-10-07 04:14:20
@ryeguy這是O(n),因爲Stream構建了一個鏈接列表來緩存元素值。 – 2009-10-07 04:44:08
好的,Stream和Iterable之間有什麼區別呢? – 2011-05-30 22:30:48