Perbedaan di antara mereka adalah, bahwa a valdieksekusi ketika didefinisikan sedangkan a lazy valdieksekusi ketika diakses pertama kali.
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
Berbeda dengan metode (didefinisikan dengan def) a lazy valdieksekusi sekali dan kemudian tidak pernah lagi. Ini bisa bermanfaat ketika operasi membutuhkan waktu lama untuk diselesaikan dan ketika tidak yakin apakah nanti digunakan.
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
Di sini, ketika nilai-nilai xdan ytidak pernah digunakan, hanya xmembuang-buang sumber daya yang tidak perlu. Jika kita mengira itu ytidak memiliki efek samping dan bahwa kita tidak tahu seberapa sering itu diakses (tidak pernah, sekali, ribuan kali) tidak ada gunanya untuk menyatakannya defkarena kita tidak ingin menjalankannya beberapa kali.
Jika Anda ingin tahu bagaimana lazy valspenerapannya, lihat pertanyaan ini .