關於學習scala中lazy關鍵字的記錄

2021-10-21 08:38:07 字數 1191 閱讀 1399

最近,看到乙個scala裡關於lazy懶載入的關鍵字。測試了一遍它的使用和功能。lazy修飾變數就是為了延遲初始化。

使用lazy關鍵字修飾變數後,只有在使用該變數時,才會呼叫其實例化方法。

1.不使用lazy關鍵字。

object lazy_study 

def main(agrs:array[string]): unit =

}

結果:

可以看到,在宣告時,立即進行例項化,呼叫了`init()「例項化方法

2.使用lazy關鍵字。

object lazy_study 

def main(agrs:array[string]): unit =

}

結果:

可以看到,在宣告時,並沒有進行例項化這個val變數,並且只有在呼叫惰性變數時,才會去例項化這個變數。並且無論縮少次呼叫,例項化方法只會執行一次

意思是:只有在第一次使用該變數時,變數對應的表示式才會被計算。之後再呼叫時,會通過乙個叫flag變數(做一次位與操作)判斷是否已經初始化過,保證只有在第一次被訪問時才會呼叫該方法。scala裡的lazy變數,背後的實現是個典型的雙重檢測鎖(dcl)模式。

如這裡所說:

對於這樣乙個表示式: lazy val t:t = expr 無論expr是什麼東西,字面量也好,方法呼叫也好。scala的編譯器都會把這個expr包在乙個方法中,並且生成乙個flag來決定只在t第一次被訪問時才呼叫該方法。

對於使用了lazy的變數來說,之後對它的呼叫,每次使用前都會以執行緒安全的方式檢查是否已經初始化,會有額外的開銷,並沒有那麼高效。

因此,我們需要考慮惰性值的使用情況。只有當保護式帶來的額外開銷小於初始化帶來的開銷時,或者將某些值惰性化能簡化系統初始化過程並確保執行順序滿足條件時,我們才應該使用惰性值。這種特性對於特別耗時的計算操作特別有用。

因此,lazy的使用要具體情況具體分析,並不一定都是有用的。

Scala 中為什麼不建議用 return 關鍵字

在scala中使用 return 的話,編譯的時候會提示the latest statement is method is automatically returned,use of th return keyword is redundant.這個警告是說最後乙個語句的結果會自動返回,不需要使用r...

Scala學習筆記 Scala中的柯里化

柯里化的意義 一 提高程式效能,而是使 模組化,減少耦合增強其可維護性。二 函式的通用性有所降低,但是適用性有所提高。沒使用語法糖的 sum 函式 def sum f int int int,int int 使用語法糖後的 sum 函式 def sum f int int a int,b int i...

scala學習中遇到的問題

所謂一階函式就是函式的引數不是函式,而是普通的變數 所謂高階函式就是函式的引數是函式,此時認為函式是高階函式。用 可以向集合當中新增具體的元素,用 可以向集合當中新增具體的集合 list或者array 1 map就是對集合中的所有元素執行乙個具體的函式,將函式作用在數值上,並返回乙個新的集合結果 2...