为什么方法“组合”返回Iterator而不是Scala中的Stream?

时间:2011-12-02 11:16:49

标签: scala stream iterator scala-collections lazy-evaluation

我注意到方法combinations(来自here)会返回Iterator。该方法应该“懒惰”以避免事先生成所有组合,这似乎是合理的。现在我想知道,为什么它会返回Iterator而不是Stream(这是Scala中的一个惰性列表)。

那么,为什么combinations会返回Iterator而不是Stream

4 个答案:

答案 0 :(得分:4)

使用Stream,所有生成的值更有可能保存在内存中。

scala> val s = Stream.iterate(0)(_ + 1)
s: scala.collection.immutable.Stream[Int] = Stream(0, ?)

scala> s.drop(3).head
res1: Int = 3

scala> s
res2: scala.collection.immutable.Stream[Int] = Stream(0, 1, 2, 3, ?)

当您保留对Stream的引用时,所有生成的元素都将保留在内存中。使用Iterator时,这种情况不太可能发生。

当然,这不一定是为什么Scala库的设计方式......

答案 1 :(得分:3)

我认为因为Stream会缓存所有以前返回的元素,所以最终会将所有元素都存储在内存中。迭代器只返回下一个

答案 2 :(得分:3)

正如我在CombinationsItr代码中看到的那样,每次调用next方法时,您都会进行惰性评估。 见https://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_9_1_final/src//library/scala/collection/SeqLike.scala#L198

因此,当使用next获取下一个组合时,例如:

scala> val combinations = "azertyuiop".combinations(2)
scala> combinations.next
res9: String = az

next的结果会被懒惰地评估。

答案 3 :(得分:2)

IteratorStream便宜。如果需要,你总是可以从前者获得后者。