2011-07-23 7 views

Respuesta

75

Ver produce una colección floja, por lo que las llamadas a, p. filter no evalúa cada elemento de la colección. Los elementos solo se evalúan una vez que se accede de forma explícita. Ahora sum tiene acceso a todos los elementos, pero con view la llamada a filter no crea un vector completo. (Véase el comentario de Steve)

Un buen ejemplo del uso de vista sería:

scala> (1 to 1000000000).filter(_ % 2 == 0).take(10).toList 
java.lang.OutOfMemoryError: GC overhead limit exceeded 

Aquí Scala intenta crear una colección con 1000000000 elementos para luego acceder a la primera 10. Pero con vistas:

scala> (1 to 1000000000).view.filter(_ % 2 == 0).take(10).toList 
res2: List[Int] = List(2, 4, 6, 8, 10, 12, 14, 16, 18, 20) 
+8

Nitpick: la afirmación "desde que Sum accede a todos los elementos, no tiene sentido usar la vista aquí" no es correcta, porque 'filter' intentará crear un' Vector' completo antes de invocar 'sum' en él. Intente reemplazar 1000 con 1000000000 en el ejemplo original y si deja 'vista 'desactivada, verá los mismos problemas de memoria que ha demostrado anteriormente. – Steve

+0

Gracias por señalar eso. Solucionado mi respuesta. –

19

no sé mucho acerca de Scala, pero tal vez podría ayudar this page ...

Hay dos formas principales de implementar transformadores. Uno es estricto, es decir, una nueva colección con todos sus elementos está construida como resultado del transformador. El otro es no estricto o flojo, es decir, uno solo construye un proxy para la colección de resultados, y sus elementos se construyen solo cuando uno los exija.

A vista es un tipo especial de colección que representa una colección de base, pero implementa todos los transformadores de forma perezosa.

por lo que suena como si el código seguirá funcionando sin view, pero podría, en teoría, estar haciendo un trabajo extra construcción de todos los elementos de su colección en estricta en lugar de perezoso moda.

+0

¿Por qué está esto downvoted? – soc

+0

gracias por el enlace de referencia, que fue muy útil – daydreamer