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


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

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

4 51

4 ответа:

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

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

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

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

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

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

    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

посмотреть вид С Scala 2.8 Collections API.

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

...

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

...

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

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

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

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