stream与视图vs迭代器
Streams,Views(SeqView)和scala中的迭代器有什么区别? 这是我的理解:
- 他们都是懒惰的名单。
- streamcaching值。
- 迭代器只能使用一次? 你不能回到开始,再次评估价值?
- 视图的值不被caching,但您可以一次又一次地评估它们?
所以,如果我想节省堆空间,我应该使用迭代器(如果我不会再遍历列表)或视图? 谢谢。
首先,他们都是非严格的 。 这与函数有一个特定的math意义,但基本上,意味着它们是按需而不是预先计算的。
Stream
确实是一个懒惰的列表。 事实上,在斯卡拉, Stream
是一个tail
是lazy val
的List
。 一旦计算,一个值保持计算并被重用。 或者,如你所说,这些值被caching。
Iterator
只能使用一次,因为它是一个遍历集合的遍历指针 ,而不是集合本身。 Scala中的特殊之处在于,您可以应用诸如map
和filter
转换,并简单地获得一个新的Iterator
,它只会在请求下一个元素时应用这些转换。
Scala曾经提供了可以重置的迭代器,但是很难以一般的方式来支持,而且他们没有制作2.8.0版本。
视图意味着更像数据库视图。 这是一个适用于collections制作“虚拟”collections的一系列转型。 正如你所说,每次需要从中获取元素时,所有转换都会重新应用。
Iterator
和视图都具有优良的内存特性。 Stream
是好的,但是,在斯卡拉,它的主要好处是写无限序列(特别是recursion定义的序列)。 可以避免将所有的Stream
在内存中,但是要确保不保存head
的引用(例如,使用def
而不是val
来定义Stream
)。
由于观点产生的惩罚,通常应该在应用转换之后force
执行,或者如果预期只有less数元素被提取,则与视图的总尺寸相比,将其保留为视图。