スコープ関数
スコープ関数let
, run
, with
, apply
, also
を利用すると処理を簡潔に書くことができます
let
任意のオブジェクトに対し、letで指定したlambda式を実行します。
it
で対象のオブジェクト自体を参照でき、返り値はlambda式の結果になります。
nullableな変数に対して使用できるため以下のような記述ができます
val foo = "foo"
foo?.let { println(it) }
val bar: String? = null
bar?.let { println(it) }
run
letと同様に指定したlambda式を実行します
letとは異なり対象のオブジェクトへの参照はthis
になります。返り値はlambda式の結果になります
val foo = "foo"
foo.run { println(this) }
// 呼び出し元オブジェクトのプロパティを参照する際は、thisを省略することもできます
val len = foo.run { length } // this.lengthの代わりにlengthのみ記述可能
println(len) // 3
apply
apply
を使用するとオブジェクトの設定をするときなどに簡潔に記述ができます。
対象のオブジェクトへの参照はthis
になります。返す値は元のオブジェクト自身です。
data class Book(var title: String, var author: String? = null, var price: Int? = null) {}
val book = Book(title = "Foo").apply {
author = "John Doe"
price = 3000
}
println(book)
also
also
はitで呼び出し元のオブジェクトを参照でき、返す値は元のオブジェクト自身になります
data class Book(var title: String, var author: String? = null, var price: Int? = null) {}
val book = Book(title = "Foo").also {
it.author = "John Doe"
it.price = 3000
}
println(book)
他にも数値の入れ替えを簡潔に書くこともできます
var a = 1
var b = 2
b = a.also { a = b }
println(a) // 2
println(b) // 1