Stream vs Views vs Iterators

时间:2011-03-01 18:56:30

标签: scala scala-collections

scala中的Streams,Views(SeqView)和迭代器之间有什么区别?这是我的理解:

  • 他们都是懒惰的名单。
  • Streams缓存值。
  • 迭代器只能使用一次?你不能回到起点并再次评估价值吗?
  • 查看的值不会被缓存,但您可以反复评估它们吗?

所以如果我想节省堆空间,我应该使用迭代器(如果我不再遍历列表)或视图?谢谢。

1 个答案:

答案 0 :(得分:176)

首先,它们都是非严格的。它具有与函数相关的特定数学意义,但基本上意味着它们是按需而不是提前计算的。

Stream确实是一个懒惰的列表。事实上,在Scala中,StreamList,其taillazy val。计算完成后,值将保持计算并重复使用。或者,如您所说,值被缓存。

Iterator只能使用一次,因为它是遍历指针到集合中,而不是集合本身。 Scala的特殊之处在于,您可以应用mapfilter之类的转换,只需获取一个新的Iterator,它只会在您请求下一个元素时应用这些转换

Scala用于提供可以重置的迭代器,但是这种方式很难以一般方式支持,并且它们没有生成2.8.0版本。

视图与数据库视图非常相似。它是一系列转换,应用于集合以生成“虚拟”集合。正如您所说,每次需要从中获取元素时,都会重新应用所有转换。

Iterator和视图都具有出色的内存特性。 Stream很好,但是,在Scala中,它的主要好处是编写无限序列(特别是递归定义的序列)。但是,一个可以避免将所有Stream保留在内存中,方法是确保不保留对其head的引用(例如,使用{{1}而不是def来定义val)。

由于视图产生的惩罚,在应用转换后通常应该Stream,或者如果预期只有少数元素被提取,则将其保留为视图,与视图的总大小相比较