Почему «комбинации» методов возвращают Iterator, а не Stream в Scala? - PullRequest
2 голосов
/ 02 декабря 2011

Я заметил, что метод combinations (из здесь ) возвращает Iterator.Представляется разумным, что метод должен быть «ленивым», чтобы избежать генерации всех комбинаций заранее.Теперь мне интересно, почему он возвращает Iterator вместо Stream (это ленивый список в Scala).

Итак, почему combinations возвращает Iterator вместо Stream?

Ответы [ 4 ]

4 голосов
/ 02 декабря 2011

При 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 спроектирована так, как она есть ...

3 голосов
/ 02 декабря 2011

Как я вижу по коду 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 голосов
/ 02 декабря 2011

Я думаю, потому что Stream кэширует все ранее возвращенные элементы, так что вы в итоге все они в памяти. Итератор возвращает только следующий

2 голосов
/ 05 декабря 2011

Iterator дешевле Stream.Вы всегда можете получить последнее из первого, если вам нужно.

...