Kotlin Scope Functions (作用域函式)

Kotlin 標準函式庫提供了 5 個非常有名的函式:let, run, with, apply, also。 它們的功能非常相似:在一個物件的 Context (作用域) 中執行程式碼。 差別在於:

  1. 這個物件在 block 裡面是用 this 還是 it 參考?
  2. 這個函式最後回傳的是 物件本身 還是 Block 的執行結果

這張表背起來就對了:

函式物件參考回傳值主要用途
letitBlock 結果配合 ?.let 做 Null check
applythis物件本身物件初始化與設定
runthisBlock 結果執行區塊並計算結果
alsoit物件本身額外操作 (如 Log)
withthisBlock 結果針對一個物件多次操作 (非 Extension)

let

最常用來處理 Nullable 物件。

val name: String? = "Miko"
name?.let { 
    // 只有當 name 不是 null 時才會執行這裡
    println("Name length is ${it.length}")
}

apply

最常用來設定物件初始化屬性(尤其是 Android 的 Intent 或 View)。

val person = Person().apply {
    name = "Miko"
    age = 18
} // 回傳設定好的 person 物件

also

適合用來做「副作用」操作,例如 Log,不影響原本流程。

val person = Person("Miko").also {
    println("Create person: $it")
}