Представления являются нестрогими версиями коллекций.Это означает, что элементы рассчитываются при доступе, а не с нетерпением, как в обычных коллекциях.
В качестве примера возьмем следующий код:
val xs = List.tabulate(5)(_ + 1)
val ys = xs.view map { x => println(x); x * x }
Просто это не будет печатать ничего, кроме каждого доступасписок выполнит вычисление и напечатает значение, т.е. каждый вызов ys.head
приведет к печати 1
.Если вы хотите снова получить строгую версию коллекции, вы можете позвонить по ней force
.В этом случае вы увидите распечатанные все числа.
Одно из применений для представлений - это когда вам нужно пройти через набор значений, которые дорого вычислить, и вам нужно только одно значение за раз.Также представления позволяют создавать ленивые последовательности, вызывая для них toStream
, который также будет кэшировать оцениваемые элементы.