scala中的Streams,Views(SeqView)和迭代器之间有什么区别?这是我的理解:
所以如果我想节省堆空间,我应该使用迭代器(如果我不再遍历列表)或视图?谢谢。
答案 0 :(得分:176)
首先,它们都是非严格的。它具有与函数相关的特定数学意义,但基本上意味着它们是按需而不是提前计算的。
Stream
确实是一个懒惰的列表。事实上,在Scala中,Stream
是List
,其tail
是lazy val
。计算完成后,值将保持计算并重复使用。或者,如您所说,值被缓存。
Iterator
只能使用一次,因为它是遍历指针到集合中,而不是集合本身。 Scala的特殊之处在于,您可以应用map
和filter
之类的转换,只需获取一个新的Iterator
,它只会在您请求下一个元素时应用这些转换
Scala用于提供可以重置的迭代器,但是这种方式很难以一般方式支持,并且它们没有生成2.8.0版本。
视图与数据库视图非常相似。它是一系列转换,应用于集合以生成“虚拟”集合。正如您所说,每次需要从中获取元素时,都会重新应用所有转换。
Iterator
和视图都具有出色的内存特性。 Stream
很好,但是,在Scala中,它的主要好处是编写无限序列(特别是递归定义的序列)。但是,一个可以避免将所有Stream
保留在内存中,方法是确保不保留对其head
的引用(例如,使用{{1}而不是def
来定义val
)。
由于视图产生的惩罚,在应用转换后通常应该Stream
,或者如果预期只有少数元素被提取,则将其保留为视图,与视图的总大小相比较