Что такое виды коллекций и когда вы хотите их использовать? - PullRequest
52 голосов
/ 29 июля 2010

В Scala для многих (всех?) Типов коллекций вы можете создавать представления.

Что такое представление и для каких целей оно полезно?

Ответы [ 4 ]

47 голосов
/ 29 июля 2010

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

В качестве примера возьмем следующий код:

val xs = List.tabulate(5)(_ + 1)
val ys = xs.view map { x => println(x); x * x }

Просто это не будет печатать ничего, кроме каждого доступасписок выполнит вычисление и напечатает значение, т.е. каждый вызов ys.head приведет к печати 1.Если вы хотите снова получить строгую версию коллекции, вы можете позвонить по ней force.В этом случае вы увидите распечатанные все числа.

Одно из применений для представлений - это когда вам нужно пройти через набор значений, которые дорого вычислить, и вам нужно только одно значение за раз.Также представления позволяют создавать ленивые последовательности, вызывая для них toStream, который также будет кэшировать оцениваемые элементы.

13 голосов
/ 30 марта 2015

Один случай использования - это когда вам нужно собрать первый результат преобразования элементов:

    case class Transform(n: Int) { println("Transform "+n)}
    val list = List(1,2,3,4,5)
    list.view.map(v => Transform(v)).collectFirst{case Transform(3) => println("found")}

Отпечатки:

Transform 1
Transform 2
Transform 3
found

Пока:

    list.map(v => Transform(v)).collectFirst{case Transform(3) => println("found")}

Отпечатки:

Transform 1
Transform 2
Transform 3
Transform 4
Transform 5
found
9 голосов
/ 15 декабря 2010

См. Представления из API коллекций Scala 2.8 .

По умолчанию коллекции Scala строги во всех своих преобразователях, кроме Stream, чтореализует все свои трансформерские методы лениво.Однако существует систематический способ превратить каждую коллекцию в ленивую и наоборот , основанную на представлениях коллекции. view - это особый вид коллекции, представляющий некоторую базовую коллекцию, но реализующий все преобразователи лениво.

...

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

...

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

0 голосов
/ 11 мая 2018

представление используется для отложенных вычислений, но не для сохранения памяти.

При создании представления для коллекции память уже была выделена для коллекции.

При создании представленияпри val view = Range(1,9).view. коллекции уже выделена память, если она слишком велика, скажем, Range(1,1000000000), OOM нельзя избежать

...