似乎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. stl迭代器的postfix和前綴增量之間的區別?
- 2. 輸入迭代器和只讀前向迭代器之間有什麼區別?
- 3. Java:迭代器和陣列列表之間的區別
- 4. `迭代器`和`元素引用之間的區別`
- 5. Spark toLocalIterator和迭代器方法之間的區別
- 6. Java枚舉和迭代器之間的區別
- 7. scala和java枚舉之間的區別
- 8. Anorm Scala executeUpdate和executeInsert之間的區別
- 9. 方法迭代器和視圖之間有什麼區別?
- 10. smarty中的foreach和迭代之間的區別
- 11. JavaScript中循環的迭代器和生成器之間的區別
- 12. Lua中有狀態和無狀態迭代器之間的區別
- 13. 迭代行與while和數組賦值之間的區別
- 14. 索引和迭代器的區別是?
- 15. C#中緩衝區和流之間的區別
- 16. http_proxy,https_proxy和代理之間的區別?
- 17. 協議和代表之間的區別?
- 18. $ HOME和'〜'(代字號)之間的區別?
- 19. Scala中的>>和>>>之間的區別
- 20. Scala中的RegexpParsers,StandardTokenParsers和JavaTokenParsers之間的區別
- 21. Scala迭代器/流與已知大小
- 22. Boost單通迭代器和前向遍歷迭代器之間有什麼區別?
- 23. Scala中的JsObject和JsValue之間有什麼區別?
- 24. Scala中f(a,b)和f(a)(b)之間的區別
- 25. 在Scala中,樂趣_和樂趣之間的區別是什麼
- 26. 流星中部署的代碼和調試代碼之間有什麼區別?
- 27. 監視器和鎖之間的區別?
- 28. 集合和容器之間的區別
- 29. 'int'對象不可迭代和兩個代碼之間的區別?
- 30. 在C#中使用迭代器創建Enumerable或Enumerator之間的區別
關於記憶 - 如果我訪問第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