started software getting example scala

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)