What is the purpose of the 'lazy' keyword in Scala?
Instruction: Explain how the 'lazy' keyword affects variable initialization in Scala and provide an example.
Updated
lazy val delays evaluation of its initializer until the value is first accessed, then retains the successfully computed result. It applies to a value definition, not to a general mutable lazy var.
final class Settings {
var evaluations = 0
lazy val parsed: List[String] = {
evaluations += 1
"red,blue".split(",").toList
}
}
@main def lazyExample(): Unit = {
val settings = new Settings
assert(settings.evaluations == 0)
assert(settings.parsed == List("red", "blue"))
assert(settings.parsed == List("red", "blue"))
assert(settings.evaluations == 1)
}
This avoids the parsing work when parsed is never used. It also shifts that work, and any initialization failure, to the first access. A failed initializer is not a successfully cached value; subsequent access can attempt initialization again. Recursive or cyclic initialization must be avoided. Lazy initialization
Lazy evaluation is useful for optional expensive computations or carefully designed initialization dependencies. It does not eliminate errors, guarantee lower total latency, or make the resulting object immutable. Retaining the result can keep memory alive, and initialization coordination has a cost.
For a resource such as a database connection, delayed creation still needs an explicit lifecycle, failure policy and cleanup. A plain def recomputes when called; a by-name parameter is evaluated on each use unless the receiver memoizes it. Choose the evaluation policy from the required semantics, then measure any performance benefit.