La evaluación perezosa
Calcule los valores solo cuando sea necesario
La evaluación perezosa es una lección gratuita de Scala for Backend Engineering & Functional Programming en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Scala for Backend Engineering & Functional Programming, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Scala for Backend Engineering & Functional Programming incluye 4 lecciones en total.
¿Qué es la evaluación perezosa?
En Scala, la mayoría de los valores son estrictos: se calculan en el momento en que se definen. La evaluación perezosa invierte este comportamiento. Un valor perezoso solo se calcula cuando se necesita por primera vez, nunca antes.
Esto es importante cuando los cálculos son costosos, pueden fallar o quizá no lleguen a utilizarse. ¿Por qué pagar por un trabajo que nadie solicita?
val estricto
Un val normal evalúa su expresión derecha inmediatamente, aunque nunca vuelva a leerlo.
Ejecute esto y observe que "computing" se imprime antes que "after". El trabajo se realiza en el momento de la definición.
object Demo extends App {
val x = { println("computing"); 42 }
println("after")
println(x)
}lazy val
Anteponlazy a un val y la evaluación se aplaza hasta el primer acceso.
Aquí "after" se imprime primero y, después, "computing" solo cuando se lee x. El resultado también se almacena en caché: el cuerpo se ejecuta como máximo una vez.
object Demo extends App {
lazy val x = { println("computing"); 42 }
println("after")
println(x)
println(x)
}Parámetros by-name
Un parámetro declarado como => A se pasa por nombre: el argumento no se evalúa hasta que se utiliza dentro del método.
Este es el fundamento de la evaluación perezosa. LazyList utiliza parámetros por nombre para que la cola nunca se calcule hasta que se solicite.
def maybe(cond: Boolean, value: => Int): Int =
if (cond) value else 0
val r = maybe(false, { println("side"); 99 })
// "side" never prints; value was unusedConozca LazyList
LazyList es la secuencia perezosa de Scala (sustituyó a la antigua Stream a partir de la versión 2.13). La cabeza se evalúa de inmediato, pero la cola es perezosa.
Los elementos se producen bajo demanda y se memorizan una vez calculados, por lo que nunca se vuelve a calcular dos veces la misma celda.
val ll = LazyList(1, 2, 3)
println(ll)
// prints LazyList(<not computed>) until forcedForzar la evaluación
Una LazyList permanece sin evaluar hasta que se fuerza. Al llamar a toList, foreach o imprimir cada elemento, se fuerzan las celdas.
El REPL muestra <not computed> para la cola perezosa. Al forzarla se revelan los valores reales.
object Demo extends App {
val ll = LazyList(1, 2, 3)
println(ll.toList)
}El operador #::
Puede anteponer elementos a una LazyList con #::. A diferencia de :: de las listas, el operando derecho de #:: se pasa por nombre, por lo que la cola no se construye hasta que se necesita.
Esto permite describir secuencias cuyo resto se calcula de forma perezosa.
val ll = 1 #:: 2 #:: 3 #:: LazyList.empty
println(ll.head)Memoización
Una vez calculada una celda de una LazyList, su valor se almacena. Volver a leerlo no tiene coste y la expresión que lo produce no se ejecuta dos veces.
Ejecute esto: "calc" solo se imprime en el primer acceso a cada elemento forzado, no en las lecturas repetidas.
object Demo extends App {
val ll = LazyList(1, 2).map { n =>
println("calc " + n); n * 10
}
println(ll.head)
println(ll.head)
}La cola perezosa en acción
Como la cola es perezosa, puede aplicar map a una LazyList y solo se calculan los elementos que consulta.
Aquí "map" se imprime una sola vez aunque la lista tiene tres elementos, porque solo se fuerza la cabeza.
object Demo extends App {
val r = LazyList(1, 2, 3).map { n =>
println("map " + n); n + 1
}
println(r.head)
}Por qué resulta útil la evaluación perezosa
La evaluación perezosa permite evitar trabajo innecesario, construir secuencias infinitas y desacoplar la forma de describir un cálculo de la cantidad que se ejecuta.
Escriba toda la canalización una vez; el consumidor decide cuántos elementos obtener.
Una precaución
La evaluación perezosa tiene costes. LazyList memoriza los valores, por lo que conservar una referencia a su cabeza mantiene en memoria todos los elementos forzados. Para datos enormes o infinitos, evite conservar la cabeza.
Además, los efectos secundarios del código perezoso se ejecutan en momentos inesperados, lo que puede dificultar la depuración.
Comprobación rápida
Compruebe su comprensión de la evaluación perezosa.
Resumen
La evaluación estricta ejecuta el trabajo de inmediato; la evaluación perezosa lo pospone hasta que se necesita. lazy val y los parámetros por nombre (=> A) son los mecanismos básicos.
LazyList se basa en ellos: cabeza estricta, cola perezosa y memorizada, que se fuerza mediante toList o el acceso a los elementos. A continuación, construiremos LazyList manualmente.
Aprende Scala con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 39
- Lecciones
- 143
Preguntas frecuentes
¿La lección «La evaluación perezosa» es gratis?
Sí — el texto completo de «La evaluación perezosa» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Scala for Backend Engineering & Functional Programming, actualiza a CoddyKit PRO. El curso de Scala for Backend Engineering & Functional Programming incluye 4 lecciones en total.
¿Qué aprenderé en «La evaluación perezosa»?
Calcule los valores solo cuando sea necesario Practicas Scala for Backend Engineering & Functional Programming con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Scala for Backend Engineering & Functional Programming?
No se requiere experiencia previa. Scala for Backend Engineering & Functional Programming en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «La evaluación perezosa»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Scala for Backend Engineering & Functional Programming?
Sí. Cada lección de Scala for Backend Engineering & Functional Programming incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- La evaluación perezosa
- Crear una LazyList
- Streams infinitos
- Tomar y filtrar de forma perezosa