stream与视图vs迭代器

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

  • 他们都是懒惰的名单。
  • streamcaching值。
  • 迭代器只能使用一次? 你不能回到开始,再次评估价值?
  • 视图的值不被caching,但您可以一次又一次地评估它们?

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

首先,他们都是非严格的 。 这与函数有一个特定的math意义,但基本上,意味着它们是按需而不是预先计算的。

Stream确实是一个懒惰的列表。 事实上,在斯卡拉, Stream是一个taillazy valList 。 一旦计算,一个值保持计算并被重用。 或者,如你所说,这些值被caching。

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

Scala曾经提供了可以重置的迭代器,但是很难以一般的方式来支持,而且他们没有制作2.8.0版本。

视图意味着更像数据库视图。 这是一个适用于collections制作“虚拟”collections的一系列转型。 正如你所说,每次需要从中获取元素时,所有转换都会重新应用。

Iterator和视图都具有优良的内存特性。 Stream是好的,但是,在斯卡拉,它的主要好处是写无限序列(特别是recursion定义的序列)。 可以避免将所有的Stream在内存中,但是要确保不保存head的引用(例如,使用def而不是val来定义Stream )。

由于观点产生的惩罚,通常应该在应用转换之后force执行,或者如果预期只有less数元素被提取,则与视图的总尺寸相比,将其保留为视图。