2009-10-06 65 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