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

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

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

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 API Коллекций.

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

...

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

...

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

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

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

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

Другие вопросы по тегам