Der Unterschied zwischen ihnen besteht darin, dass a valausgeführt wird, wenn es definiert ist, während a lazy valausgeführt wird, wenn beim ersten Zugriff darauf zugegriffen wird.
scala> val x = { println("x"); 15 }
x
x: Int = 15
scala> lazy val y = { println("y"); 13 }
y: Int = <lazy>
scala> x
res2: Int = 15
scala> y
y
res3: Int = 13
scala> y
res4: Int = 13
Im Gegensatz zu einer Methode (definiert mit def) lazy valwird a einmal und dann nie wieder ausgeführt. Dies kann nützlich sein, wenn ein Vorgang lange dauert und nicht sicher ist, ob er später verwendet wird.
scala> class X { val x = { Thread.sleep(2000); 15 } }
defined class X
scala> class Y { lazy val y = { Thread.sleep(2000); 13 } }
defined class Y
scala> new X
res5: X = X@262505b7 // we have to wait two seconds to the result
scala> new Y
res6: Y = Y@1555bd22 // this appears immediately
Hier werden, wenn die Werte xund ynie verwendet werden, nur xunnötig Ressourcen verschwendet. Wenn wir annehmen, dass dies ykeine Nebenwirkungen hat und wir nicht wissen, wie oft darauf zugegriffen wird (niemals, einmal, tausende Male), ist es sinnlos, dies als zu deklarieren, defda wir es nicht mehrmals ausführen möchten.
Wenn Sie wissen möchten, wie sie lazy valsimplementiert werden, lesen Sie diese Frage .