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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

    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

Ответ 3

См. Виды из Scala 2.8 API коллекций.

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

...

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

...

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