Kotlinのスコープ関数の戻り値の違いと使い分けを初心者向けに解説!
生徒
「Kotlinのスコープ関数っていろいろありますけど、何がどう違うんですか?特に戻り値の違いがよくわかりません…」
先生
「たしかにlet・run・apply・also・withは似ているようで、実は戻り値が違うんですよ。そこをしっかり理解すれば、使い分けもスムーズになりますよ!」
生徒
「なるほど…!戻り値で使い方が変わるってことですか?」
先生
「そのとおり!今回は初心者でもわかるように、それぞれの違いや使い方をゆっくり解説していきますね!」
1. スコープ関数とは?
まず「スコープ関数」とは、Kotlinでよく使われる便利な関数のことです。あるオブジェクトに対して、一時的に何か処理をしたいときに使います。
代表的なスコープ関数は、let・run・apply・also・withの5つです。使い方は似ていますが、戻り値や処理の書き方に違いがあります。
2. スコープ関数の戻り値の違いとは?
Kotlinのスコープ関数を使いこなすカギは「戻り値の違い」です。戻り値とは、関数を使ったあとに何が返ってくるか、ということです。
let→ ラムダ式の「最後の式の結果」を返すrun→ ラムダ式の「最後の式の結果」を返すapply→ 「元のオブジェクト(this)」を返すalso→ 「元のオブジェクト(it)」を返すwith→ ラムダ式の「最後の式の結果」を返す
文字だけだとわかりづらいので、次に具体例を見てみましょう!
3. letの戻り値と使い方
letは「何かを加工して使いたい」場面に向いています。戻り値はラムダの最後の式になります。
val result = "kotlin".let {
it.uppercase()
}
println(result)
KOTLIN
letは加工した結果を取り出すときに便利です。
4. runの戻り値と使い方
runもletと同じように、最後の式の結果を返します。ただし、thisでオブジェクトにアクセスするのが違いです。
val message = "kotlin".run {
this.reversed()
}
println(message)
niltok
runはthisがメインなので、クラスの初期化や一括設定にもよく使われます。
5. applyの戻り値と使い方
applyは「元のオブジェクトそのもの」が戻り値になります。オブジェクトを設定してから、そのまま戻したいときに使います。
val sb = StringBuilder().apply {
append("Hello")
append(", Kotlin")
}
println(sb.toString())
Hello, Kotlin
applyは設定をまとめて書くときに便利です。
6. alsoの戻り値と使い方
alsoもapplyと同じく、元のオブジェクトが戻ってきます。ただし、使い方はletと同じようにitで書きます。
val list = mutableListOf("A", "B").also {
it.add("C")
}
println(list)
[A, B, C]
alsoは「処理の途中で確認やログを入れたい」ときに向いています。
7. withの戻り値と使い方
withは少し特殊で、対象のオブジェクトを引数にして、ブロック内はthisで操作します。戻り値は最後の式の結果です。
val length = with("Kotlin") {
println("文字数は${length}です")
length
}
println(length)
文字数は6です
6
withは「特定のオブジェクトに対して複数の処理をしたいとき」に使います。
8. 戻り値で使い分けるコツ
ここまでのポイントをおさらいしましょう。Kotlinのスコープ関数の使い分けは、「何を返したいか」が大きなポイントです。
letやrun:処理の結果を返したいときapplyやalso:元のオブジェクトを返したいときwith:少し特殊だが、処理の結果を返す
たとえば、何かを加工した結果を使いたいならletやrun、オブジェクトの初期設定をしたいならapplyやalsoが合っています。