Kotlin高次関数(with,run,let,also,apply)
2265 ワード
with
関数は次のように定義されます.
汎用パラメータTを受信し、メソッド内の最後の行のコードを返す.メソッド内でTの代わりにthisを使用するか、thisを省略します.
run
関数は次のように定義されます.
パラメータは受信されず、結果は最後の行コードに戻ります.
以下に拡張メソッドを示します.
run
関数は次のように定義されます.
T後にrunメソッドを呼び出し,メソッド内の最後の行コードを返す.Tの代わりにthisを使用します.
let
関数は次のように定義されます.
T後にletメソッドを呼び出し,メソッド内の最後の行コードを返す.方法体内でTの代わりにitを用いる.
T.let、最後の行を返し、内部はit
also
関数は次のように定義されます.
T後にalsoメソッドを呼び出し,結果をTとする.方法体内部ではTの代わりにitを用いる.
apply
関数は次のように定義されます.
T後にapplyメソッドを呼び出し,結果をTとする.方法体内部ではTの代わりにthisを用いる.
使い方のまとめ
これらの方法は、次の3つの状況に応じて選択できます.は、自身を返すか、それともメソッド体内の最後の行のコード を返すか.メソッド本体内部にthisが必要かit が必要か拡張メソッドが必要かどうか 3つ目の場合、最も一般的な状況は空判断です.
関数は次のように定義されます.
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つの状況に応じて選択できます.
fun one(builder: StringBuilder?) {
builder?.run {
append("a")
append("b")
append("c")
}
}