我注意到方法combinations
(来自here)会返回Iterator
。该方法应该“懒惰”以避免事先生成所有组合,这似乎是合理的。现在我想知道,为什么它会返回Iterator
而不是Stream
(这是Scala中的一个惰性列表)。
那么,为什么combinations
会返回Iterator
而不是Stream
?
答案 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)
Iterator
比Stream
便宜。如果需要,你总是可以从前者获得后者。