在kotlin中可以直接調(diào)用的函數(shù),叫做標準函數(shù). with run apply 是比較常見,但它們?nèi)咧g也是有區(qū)別的.
with
with 直接調(diào)用,有兩個參數(shù). 第一個是數(shù)據(jù)對象,第二個是lambda表達式.其中l(wèi)ambda表達式中持有參數(shù)一數(shù)據(jù)對象的上下文,沒有返回值.
with("hello world"){
val msg = replace("hello","hi")
println(msg)
}
// 控制臺打印 hi world
let
對象直接調(diào)用,有一個lambda參數(shù).允許對一個對象執(zhí)行特定的操作,并在操作完成之后返回結(jié)果,通常用于處理可空對象或?qū)σ粋€對象鏈式調(diào)用.
val name: String? = "John"
val result = name?.let { it ->
val upperCaseName = it.toUpperCase()
"Hello, $upperCaseName!"
} ?: "Name is null"
println(result) // 輸出:"Hello, JOHN!"
run
需要數(shù)據(jù)對象調(diào)用,有一個lambda參數(shù).同樣lambda表達式中也持有數(shù)據(jù)對象的上下文. 有返回值.
val sbRun = StringBuffer().run {
append(1)
append(2)
append(3)
append(4)
append(5)
}
println(sbRun.toString())
// 控制臺打印 12345
apply
需要數(shù)據(jù)對象調(diào)用,和run類似有一個lambda參數(shù),同樣lambda表達式中也持有數(shù)據(jù)對象的上下文. 有返回值.
val sbApply = StringBuffer().apply {
append(9)
append(8)
append(7)
}
println(sbApply.append(65).toString())
// 控制臺打印 98765
run 與 apply 區(qū)別
如果僅僅上看上面的代碼,兩個函數(shù)直接是沒有區(qū)別的, 如果把run 示例代碼修改成如下,控制臺輸出是什么結(jié)果呢?
val sbRun = StringBuffer().run {
append("a")
append("b")
append("c")
888888
}
println(sbRun.toString())
// 控制臺打印 888888
打印結(jié)果是 lambda表達式最后一行代碼.并且類型是Int. 而不是StringBuffer. 那么在來看看apply函數(shù).
上面控制臺打印結(jié)果: 你好呀. 絲毫不受lambda表達式最后一行的影響.
總結(jié)
with 直接調(diào)用不需要數(shù)據(jù)對象. 有兩個參數(shù).沒有返回值.
let 在對象上執(zhí)行操作,并返回操作結(jié)果.用于處理可空對象或進行鏈式調(diào)用.
run 需要數(shù)據(jù)對象調(diào)用,只有一個參數(shù),有返回值. 將lambda表達式中最后一行代碼作為返回值返回.
apply 需要數(shù)據(jù)對象調(diào)用,只有一個參數(shù),有返回值. 將調(diào)用者數(shù)據(jù)對象作為返回值返回.
run 和 apply 函數(shù)很像,但是返回值不一樣.