why
ブロック処理は Kotlin の基礎であり、必須だと気づいたから
参考
Kotlin サーバーサイドプログラミング実践開発
Page 100 of 495
5 つのスコープ関数
with
run
let
apply
also
これらの 5 つのスコープ関数が有る。
これは関数やインスタンスに追加したり、引数として取ることで拡張できる。
let
一番シンプル。関数に追加すると、その関数の結果を it として扱えるブロックを作成できる。
fun get1(): Int{
return 1
}
val letTest = get1().let { it + 1 }
println(letTest)
2
ここでは 1 を返す関数に let をつけたので
it が 1 として扱われ、1 + 1 で 2 が返ってくる。
前の記事に書いたように、?.let を使うことで null ではない場合のみ実行できる。これによって nullable な値もぬるぽの心配なく安全に扱える。
run
run では it ではなく this で元の関数の返り値が扱える。
fun get1(): Int{
return 1
}
get1().run { println(this+1)}
2
fun get1OrNull(): Int?{
return null
}
get1OrNull()?.run { println(this+1) }
こちらも Null 安全な実行ができる。
with
fun get1(): Int{
return 1
}
val withTest = with(get1()) { this + 1 }
println(withTest)
2
with は引数で関数の結果をレシーバーとして受け取る。
そして次のブロックで this として扱い処理し、返り値とする。
どうみても run の方が使いやすい。
apply
fun get1(): Int{
return 1
}
val applyTest = get1().apply { this + 1 }
println(applyTest)
1
apply はブロックの結果を返さない。
let や with とはそこが違う。
apply を当てた関数が返って来ている。
data class Dog(var name: String)
val pochi = Dog("Pochi")
val applyTest = pochi.apply { this.name = "Hachi" }
println(applyTest)
Dog(name=Hachi)
name = Pochi として作成した Dog のインスタンスを
apply を使って this.name にアクセスして
name = Hachi に変更することができた。
also
data class Dog(var name: String, var age: Int)
val pochi = Dog("D",3)
val alsoTest = pochi.also { it.name = "E" } .also { it.age = 10 }
println(alsoTest)
Dog(name=E, age=10)
also も apply と同じく本体を返す。
apply と違っていくつでもつなげていくことができる。