您好,登錄后才能下訂單哦!
惰性計算(盡可能延遲表達式求值)是許多函數(shù)式編程語言的特性。惰性集合在需要時提供其元素,無需預(yù)先計算它們,這帶來了一些好處。首先,您可以將耗時的計算推遲到絕對需要的時候。其次,您可以創(chuàng)造無限個集合,只要它們繼續(xù)收到請求,就會繼續(xù)提供元素。函數(shù)的惰性使用讓您能夠得到更高效的代碼。Java并沒有為惰性提供原生支持, Scala提供了,使用很方便。
懶漢式
public class LazyDemo {
private String property; //屬性也可能是一個數(shù)據(jù)庫連接,文件等資源
public String getProperty(){
if (property==null){
property=initProperty(); //如果沒有初始化過,那么進行初始化
}
return property;
}
private String initProperty() {
return "property";
}
}
當(dāng)函數(shù)被聲明為lazy的時候,函數(shù)并不會立即執(zhí)行,而是當(dāng)我們首次對這個函數(shù)進行調(diào)用了,我們才會執(zhí)行這個函數(shù)。所以我們把這個叫做惰性函數(shù)(在java中叫做懶加載)。
代碼一:
object LazyDemo {
def main(args: Array[String]): Unit = {
val res= sum(10,20) //沒有l(wèi)azy的修飾,這個函數(shù)就是eager的
println("================")
// println("res:"+res)
}
def sum(a:Int,b:Int):Int={
println("sum執(zhí)行了")
a+b
}
}
輸出: ================
sum執(zhí)行了
res:30
代碼二:
object LazyDemo {
def main(args: Array[String]): Unit = {
lazy val res= sum(10,20) // lazy修飾,sum()函數(shù)不會被立即執(zhí)行,要首次被調(diào)用之后再執(zhí)行
println("================")
// println("res:"+res)
}
def sum(a:Int,b:Int):Int={
println("sum執(zhí)行了")
a+b
}
}
輸出: ================
代碼二:
object LazyDemo {
def main(args: Array[String]): Unit = {
lazy val res= sum(10,20) // lazy修飾,sum()函數(shù)不會被立即執(zhí)行,要首次被調(diào)用之后再執(zhí)行
println("================")
println("res:"+res) //調(diào)用sum方法
}
def sum(a:Int,b:Int):Int={
println("sum執(zhí)行了")
a+b
}
}
輸出: ================
sum執(zhí)行了
res:30
綜上我們可以看出,scala中被lazy修飾之后,可以實現(xiàn)懶加載,這在大數(shù)據(jù)項目中數(shù)據(jù)的加載計算會非常有用!!
1)lazy不能修飾var類型變量
2)函數(shù)被lazy修飾后,會導(dǎo)致函數(shù)的運行被推遲,我們在聲明一個變量,如果給變量加個lazy,那么變量的聲明也會被推遲,只有被使用時才會聲明生效。例如:
scala> val a=100
a: Int = 100
scala> lazy val b=1000
b: Int = <lazy>
scala> println(b)
1000
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。