Подтвердить что ты не робот

В чем разница между представлением и потоком?

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

4b9b3361

Ответ 1

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

Например:

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(" "))

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

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

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

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

Ответ 2

Geoff answer охватывает почти все, но я хочу добавить, что Stream a List -подобная последовательность, тогда как каждый вид наборов (карты, множества, индексированные seqs) имеют представления.