В чем разница между видом и потоком? - PullRequest
22 голосов
/ 17 февраля 2010

В структуре коллекций Scala 2.8, в чем разница между view и toStream?

Ответы [ 2 ]

41 голосов
/ 17 февраля 2010

В представлении элементы пересчитываются каждый раз, когда к ним обращаются. В потоке элементы сохраняются по мере их оценки.

Например:

val doubled = List(1,2,3,4,5,6,7,8,9,10).view.map(_*2)
println(doubled.mkString(" "))
println(doubled.mkString(" "))

пересмотрит карту для каждого элемента дважды. Один раз для первого println, и снова для второго. В отличие от

val doubled = List(1,2,3,4,5,6,7,8,9,10).toStream.map(_*2)
println(doubled.mkString(" "))
println(doubled.mkString(" "))

удвоит элементы только один раз.

Представление похоже на рецепт создания коллекции. Когда вы запрашиваете элементы представления, он каждый раз выполняет рецепт.

Поток похож на парня с кучей сухих карточек. Парень знает, как вычислить последующие элементы коллекции. Вы можете попросить у него следующий элемент коллекции и дать вам карточку с надписью на ней, а также строку, привязанную к карточке к его пальцу (чтобы он помнил). Кроме того, прежде чем дать вам карту, он развязывает первую строку со своего пальца и привязывает ее к новой карте.

Если вы держите первую карту (то есть сохраняете ссылку на начало потока), у вас могут в конечном итоге кончиться карты (то есть память), когда вы запрашиваете следующий элемент, но если вам не нужно идти Возвращаясь к первым элементам, вы можете обрезать строку и отдать ненужные карты обратно парню, и он сможет использовать их повторно (они после полного стирания). Вот как поток может представлять бесконечную последовательность без исчерпания памяти.

10 голосов
/ 18 февраля 2010

Джефф 's ответ охватывает почти все, но я хочу добавить, что Stream является List -подобной последовательностью, в то время как каждый вид коллекций (карт, наборы, индексированные seqs) имеют представления.

...