2009-10-06 63 views

回答

42

memoises和Iterator沒有。您可以多次遍歷相同的流並每次都得到相同的結果。另一方面,迭代器只能被遍歷一次。

+1

關於記憶 - 如果我訪問第N個元素,是訪問時間O(1)還是O(N)? – ryeguy 2009-10-07 04:14:20

+7

@ryeguy這是O(n),因爲Stream構建了一個鏈接列表來緩存元素值。 – 2009-10-07 04:44:08

+1

好的,Stream和Iterable之間有什麼區別呢? – 2011-05-30 22:30:48

18

它們都是用於訪問當前元素的構造,具有尚未知的其餘元素列表(懶惰尾部)。

Iterator是一個勢在必行的構造,你只能遍歷一次。

Stream是一個功能性構造。從理論上講,你可以多次遍歷它(和其他人提到的一樣,它不會重新計算已經計算好的部分),但是在實踐中,因爲Streams是無限的或者非常大的(這就是爲什麼你首先使用它)參考完整的流並沒有多大意義(你會遇到Out Of Memory非常容易)。

一般是比較安全的心靈避免使用普通的Stream s。替代品使用Scalaz的EphemeralStream,它使用弱引用自動忽略未引用的部分,或使用Iteratees(另請參閱here)或something similiar

+0

我很好奇:爲什麼EphemeralStream不是默認實現?您始終可以從數據沿襲(其功能語言)重建被遺忘的部分。這聽起來像是一個很大的設計缺陷。 – tribbloid 2017-05-08 22:01:05