В платформе Scala 2.8 наборов, между чем различие view
и toStream
?
В представлении элементы пересчитываются каждый раз при доступе к ним. В потоке элементы сохраняются по мере их оценки.
Например:
val doubled = List(1,2,3,4,5,6,7,8,9,10).view.map(_*2)
println(doubled.mkString(" "))
println(doubled.mkString(" "))
дважды переоценивает карту для каждого элемента. Один раз для первого отпечатка и еще раз для второго. Напротив,
val doubled = List(1,2,3,4,5,6,7,8,9,10).toStream.map(_*2)
println(doubled.mkString(" "))
println(doubled.mkString(" "))
удваивает элементы только один раз.
Просмотр подобен рецепту создания коллекции. Когда вы запрашиваете элементы представления, он каждый раз выполняет рецепт.
Ручей похож на парня с кучей сухих стираемых карточек. Этот парень умеет вычислять последующие элементы коллекции. Вы можете попросить у него следующий элемент коллекции и дать вам карточку с написанным на ней элементом и привязать веревку от карточки к его пальцу (чтобы помочь ему запомнить). Кроме того, перед тем как дать вам карту, он отвязывает первую веревку от пальца и привязывает ее к новой карте.
Если вы держите первую карту (т.е. сохраняете ссылку на заголовок потока), у вас могут в конечном итоге закончиться карты (т.е. память), когда вы запросите следующий элемент, но если вам не нужно идти Вернувшись к первым элементам, вы можете перерезать веревку и передать парню ненужные карты, и он сможет использовать их повторно (в конце концов, они стираются сухим способом). Таким образом поток может представлять бесконечную последовательность без нехватки памяти.
Джефф ответ охватывает почти все, но я хочу добавить, что Stream
представляет собой последовательность, подобную List
, а все виды коллекций (карт, наборов, проиндексированных последовательностей) имеют представления.