スコープ関数


スコープ関数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