1. run、with、apply、also、let的區別
with
with()函數是一個內聯函數,它把傳入的對象作為接受者,在該函數內可以使用this指代該對象來訪問其公有的屬性和方法。該函數的返回值為函數塊最后一行或指定的return表示式。
調用同一個對象的多個方法 / 屬性時,可以省去對象名重復,直接調用方法名 / 屬性即可
let
let()函數是一個擴展對象函數,它可以對被擴展的對象做統一的判空處理,在函數塊內使用it來指代該對象,可以訪問對象的公有屬性和方法。let()函數的返回值和with()函數一樣,為函數塊最后一行或指定的return表示式。
run
run()函數是with()和let()函數的結合體,它可以像with()函數一樣直接在函數塊中使用this指代該對象,也可以像let()函數一樣為對象做統一的判空處理。
val state = bean?.value?.toInt() ?: run {
logD(TAG, "parse bean fail, return")
return
}
apply
apply()函數和run()函數相似,不同的是,run()函數是以閉包形式返回最后一行代碼的值,而apply()函數返回的是傳入的對象本身
apply強調的是【調用者的相關操作】
also
強調的是【與調用者無關的操作】
also()函數和apply()函數相似,不同的是,also()函數在函數塊中使用it指代該對象,而apply()函數在函數塊中使用this指代該對象。
Pasted Graphic.png
2.使用場景舉例
Pasted Graphic 1.png