Scala編程之惰性函數
阿新 • • 發佈:2019-05-12
表達式求值 bject 請求 lazy 數據庫 函數介紹 object 原生 立即執行 一、為什麽需要惰性函數
惰性計算(盡可能延遲表達式求值)是許多函數式編程語言的特性。惰性集合在需要時提供其元素,無需預先計算它們,這帶來了一些好處。首先,您可以將耗時的計算推遲到絕對需要的時候。其次,您可以創造無限個集合,只要它們繼續收到請求,就會繼續提供元素。函數的惰性使用讓您能夠得到更高效的代碼。Java並沒有為惰性提供原生支持, Scala提供了,使用很方便。
二、java實現懶加載
懶漢式
public class LazyDemo { private String property; //屬性也可能是一個數據庫連接,文件等資源 public String getProperty(){ if (property==null){ property=initProperty(); //如果沒有初始化過,那麽進行初始化 } return property; } private String initProperty() { return "property"; } }
三、惰性函數介紹
當函數被聲明為lazy的時候,函數並不會立即執行,而是當我們首次對這個函數進行調用了,我們才會執行這個函數。所以我們把這個叫做惰性函數(在java中叫做懶加載)。
四、案例
代碼一:
object LazyDemo { def main(args: Array[String]): Unit = { val res= sum(10,20) //沒有lazy的修飾,這個函數就是eager的 println("================") // println("res:"+res) } def sum(a:Int,b:Int):Int={ println("sum執行了") a+b } }
輸出: ================
sum執行了
res:30
代碼二:
object LazyDemo {
def main(args: Array[String]): Unit = {
lazy val res= sum(10,20) // lazy修飾,sum()函數不會被立即執行,要首次被調用之後再執行
println("================")
// println("res:"+res)
}
def sum(a:Int,b:Int):Int={
println("sum執行了")
a+b
}
}
輸出: ================
代碼二:
object LazyDemo {
def main(args: Array[String]): Unit = {
lazy val res= sum(10,20) // lazy修飾,sum()函數不會被立即執行,要首次被調用之後再執行
println("================")
println("res:"+res) //調用sum方法
}
def sum(a:Int,b:Int):Int={
println("sum執行了")
a+b
}
}
輸出: ================
sum執行了
res:30
綜上我們可以看出,scala中被lazy修飾之後,可以實現懶加載,這在大數據項目中數據的加載計算會非常有用!!
五:註意
1)lazy不能修飾var類型變量
2)函數被lazy修飾後,會導致函數的運行被推遲,我們在聲明一個變量,如果給變量加個lazy,那麽變量的聲明也會被推遲,只有被使用時才會聲明生效。例如:
scala> val a=100
a: Int = 100
scala> lazy val b=1000
b: Int = <lazy>
scala> println(b)
1000
Scala編程之惰性函數