2010-07-29 11 views

Respuesta

46

Las vistas son versiones no estrictas de colecciones. Esto significa que los elementos se calculan en el acceso y no con entusiasmo como en las colecciones normales.

A modo de ejemplo, el siguiente código:

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

Simplemente esto no va a imprimir cualquier cosa, pero cada acceso a la lista va a realizar el cálculo e imprimir el valor, es decir, cada llamada a ys.head dará lugar a 1 bienestar impreso. Si desea obtener una versión estricta de la colección nuevamente, puede llamar al force. En este caso, verá todos los números impresos.

Un uso para las vistas es cuando necesita atravesar una colección de valores que son costosos de computar y solo necesita un valor a la vez. También las vistas le permiten construir secuencias perezosas al llamar al toStream que también almacenará en caché los elementos evaluados.

8

Ver Views de Scala 2.8 Collections API.

Las colecciones de Scala son por defecto estrictas en todos sus transformadores, excepto en Stream, que implementa todos sus métodos de transformador de forma perezosa. Sin embargo, existe una forma sistemática de convertir cada colección en una colección perezosa y viceversa, que se basa en vistas de colección. Una vista es un tipo especial de colección que representa una colección base, pero implementa todos los transformadores de forma perezosa.

...

Hay dos razones por las que es posible que desee considerar el uso de puntos de vista. El primero es el rendimiento. Usted ha visto que al cambiar una colección a una vista, se puede evitar la construcción de resultados intermedios. Estos ahorros pueden ser bastante importantes.

...

El segundo caso de uso se aplica a las vistas de secuencias mutables. Muchas funciones de transformador en tales vistas proporcionan una ventana en la secuencia original que luego puede usarse para actualizar selectivamente algunos elementos de esa secuencia.

10

Un caso de uso es cuando se necesita recolectar primer resultado de la transformación de los elementos:

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")} 

Lienzo:

Transform 1 
Transform 2 
Transform 3 
found 

rato:

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

Prints:

Transform 1 
Transform 2 
Transform 3 
Transform 4 
Transform 5 
found 
Cuestiones relacionadas