software - scala vs java
En Scala, ¿qué hace "ver"? (2)
No sé mucho sobre Scala, pero tal vez esta página podría ayudar ...
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.
Una vista es un tipo especial de colección que representa una colección base, pero implementa todos los transformadores de forma perezosa.
Parece que el código seguirá funcionando sin view
, pero en teoría podría estar haciendo un trabajo extra al construir todos los elementos de su colección de forma estricta en lugar de perezosa .
Específicamente estoy viendo el problema 1 aquí
http://pavelfatin.com/scala-for-project-euler/
El código como se detalla es el siguiente
val r = (1 until 1000).view.filter(n => n % 3 == 0 || n % 5 == 0).sum
Puedo seguir todo excepto por "ver". De hecho, si saco ver, el código aún se compila y produce exactamente la misma respuesta.
View produce una colección perezosa, por lo que las llamadas a, por ejemplo, filter
no evalúan todos los elementos 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 la view
la llamada para filter
no crea un vector completo. (Ver el comentario de Steve)
Un buen ejemplo del uso de view 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 acceder a los primeros 10. Pero con vista:
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)