Kotlin高次関数(with,run,let,also,apply)

2265 ワード

with
関数は次のように定義されます.inline fun with(receiver: T, block: T.() -> R): R
汎用パラメータTを受信し、メソッド内の最後の行のコードを返す.メソッド内でTの代わりにthisを使用するか、thisを省略します.
val len: Int = with(StringBuilder()) {
    append("a")
    append("b")
    append("c")
    length
}

run
関数は次のように定義されます.inline fun run(block: () -> R): R
パラメータは受信されず、結果は最後の行コードに戻ります.
val builder = StringBuilder()
val len: Int = run {
    builder.append("a")
    builder.append("b")
    builder.append("c")
    builder.length
}

以下に拡張メソッドを示します.
run
関数は次のように定義されます.inline fun T.run(block: T.() -> R): R
T後にrunメソッドを呼び出し,メソッド内の最後の行コードを返す.Tの代わりにthisを使用します.
val len: Int = StringBuilder().run {
    append("a")
    append("b")
    append("c")
    length
}

let
関数は次のように定義されます.inline fun T.let(block: (T) -> R): R
T後にletメソッドを呼び出し,メソッド内の最後の行コードを返す.方法体内でTの代わりにitを用いる.
val len: Int = StringBuilder().let {
    it.append("a")
    it.append("b")
    it.append("c")
    it.length
}

T.let、最後の行を返し、内部はit
also
関数は次のように定義されます.inline fun T.also(block: (T) -> Unit): T
T後にalsoメソッドを呼び出し,結果をTとする.方法体内部ではTの代わりにitを用いる.
val builder: StringBuilder = StringBuilder().also {
    it.append("a")
    it.append("b")
    it.append("c")
    it.length
}

apply
関数は次のように定義されます.inline fun T.apply(block: T.() -> Unit): T
T後にapplyメソッドを呼び出し,結果をTとする.方法体内部ではTの代わりにthisを用いる.
val builder: StringBuilder = StringBuilder().apply {
    append("a")
    append("b")
    append("c")
    length
}

使い方のまとめ
これらの方法は、次の3つの状況に応じて選択できます.
  • は、自身を返すか、それともメソッド体内の最後の行のコード
  • を返すか.
  • メソッド本体内部にthisが必要かit
  • が必要か
  • 拡張メソッドが必要かどうか
  • 3つ目の場合、最も一般的な状況は空判断です.
    fun one(builder: StringBuilder?) {
        builder?.run {
            append("a")
            append("b")
            append("c")
        }
    }