概要
Kotlinを勉強する機会があったのでスコープ関数についてです。
スコープ関数
スコープ関数とは、ラムダ式を受け取る関数です。
受け取ったラムダ式内で、オブジェクトを名前無しで呼び出し可能な一時スコープが生成されます。
thisとit
各スコープ関数では、オブジェクトにアクセスする方法として、ラムダレシーバー 「this」とラムダ引数 「it」 の2つのうちどちらかを使用します。
スコープ関数の種類
Kotlinの標準関数には、 apply、also、let 、 run 、 withの5つのスコープ関数が存在します。
apply
applyは主にプロパティ設定用関数として使えます。
・呼び出し元を「this」で参照(thisは省略可能)
・戻り値は呼び出し元のインスタンス
以下のようなコンストラクタと2つのプロパティを持つクラスの場合
class Book(val name: String){
var price = 0
var author: String? = null
}
applyを使用すると以下のようにプロパティを設定できます。
val book = Book("エンジニアの本").apply {
price = 2000
author = "エンジニア"
}
println(book.author) //=> エンジニア
また、戻り値が呼び出し元のインスタンスであるため以下の例だとhelloworld
は小文字のままです。
val str = "helloworld".apply { toUpperCase() }
println(str) //=> helloworld
also
alsoはapplyと似た使い方をします。
applyと比較すると、ラムダ式の内外でthisの意味が変わらないというメリットがあります。
・呼び出し元を「it」で参照(省略不可)
・戻り値は呼び出し元のインスタンス
val book = Book("エンジニアの本").also {
it.price = 2000
it.author = "エンジニア"
}
元のレシーバをitとして参照できますが、以下のようにbook
と命名することでコードの可読性向上に繋がります。
val book = Book("エンジニアの本").also { book ->
book.price = 2000
book.author = "エンジニア"
}
let
letはレシーバに対してメソッドを実行するといった使い方をします。
・呼び出し元を「it」で参照(省略不可)
・戻り値はラムダの結果(↓の例だとtoUpperCaseされたもの)
val str = "helloworld".let {
println(it) //=> helloworld
it.toUpperCase()
}
println(str) //=> HELLOWORLD
主な用途として、以下のようにnullチェックで使用されます。
null許容型のweightプロパティを呼び出し、nullでなければラムダの結果が出力されます。
val person = Person("Alice")
person.weight?.let {
println("体重: $it")
}
元のレシーバをitとして参照できますが、以下のようにpersonと命名することでコードの可読性向上に繋がります。
val person = Person("Alice")
person.weight?.let { person ->
println("体重: $person")
}
run
letと出来ることはほぼ同じですが、レシーバを「this」として扱うところが異なります。
・呼び出し元を「this」で参照(thisは省略可能)
・戻り値はラムダの結果
val str = "helloworld".run { toUpperCase() }
println(str) //=> HELLOWORLD
with
withは通常の関数のように呼び出し、2つの引数を取ります。第一引数にレシーバ、第二引数にラムダ式を記述します。
・呼び出し元を「this」で参照(thisは省略可能)
・戻り値はラムダの結果
val str = with("helloworld") { toUpperCase() }
println(str) //=> HELLOWORLD
まとめ
関数 | 呼び出し元の参照 | 戻り値 |
---|---|---|
apply | this | 呼び出し元のインスタンス |
also | it | 呼び出し元のインスタンス |
let | it | ラムダの結果 |
run | this | ラムダの結果 |
with | this | ラムダの結果 |
参考資料
・Scope functions
・Kotlin スコープ関数 用途まとめ
・[Kotlin]スコープ関数 apply,also,let,run,withの使い分け