В представлении элементы пересчитываются каждый раз, когда к ним обращаются. В потоке элементы сохраняются по мере их оценки.
Например:
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(" "))
удвоит элементы только один раз.
Представление похоже на рецепт создания коллекции. Когда вы запрашиваете элементы представления, он каждый раз выполняет рецепт.
Поток похож на парня с кучей сухих карточек. Парень знает, как вычислить последующие элементы коллекции. Вы можете попросить у него следующий элемент коллекции и дать вам карточку с надписью на ней, а также строку, привязанную к карточке к его пальцу (чтобы он помнил). Кроме того, прежде чем дать вам карту, он развязывает первую строку со своего пальца и привязывает ее к новой карте.
Если вы держите первую карту (то есть сохраняете ссылку на начало потока), у вас могут в конечном итоге кончиться карты (то есть память), когда вы запрашиваете следующий элемент, но если вам не нужно идти Возвращаясь к первым элементам, вы можете обрезать строку и отдать ненужные карты обратно парню, и он сможет использовать их повторно (они после полного стирания). Вот как поток может представлять бесконечную последовательность без исчерпания памяти.