Kotlinのスコープ関数まとめ!let・apply・run・also・withの違いと使い方
生徒
「Kotlinのコードでletやapplyっていうのをよく見かけるんですけど、何をしてるんですか?」
先生
「それは『スコープ関数』と呼ばれるもので、オブジェクトの使い方を少し便利にしてくれる関数です。」
生徒
「たくさんあって違いがわからないです…どれを使えばいいのか迷います。」
先生
「確かに種類が多くて混乱しがちですね。今回は let・apply・run・also・with の5つをやさしく解説していきます!」
1. スコープ関数とは?Kotlinでよく使う便利な関数
スコープ関数とは、オブジェクトに対して何か処理をしたいときに使える関数で、Kotlinが用意している便利機能のひとつです。
以下の5種類がよく使われます。
letapplyrunalsowith
この5つは書き方が似ていますが、目的や動作に少しずつ違いがあります。
2. letの使い方と特徴
letは、変数の値を一時的に別の名前(通常はit)で扱って処理したいときに使います。
val name = "taro"
name.let {
println("名前は ${it.uppercase()} です")
}
letは、関数の最後の値を返すという特徴もあります。
Nullチェックや、処理の一時的なブロックに使うのが定番です。
3. applyの使い方と特徴
applyは、オブジェクトの初期化に使われることが多いスコープ関数です。
val user = StringBuilder().apply {
append("Taro")
append(" Yamada")
}
println(user.toString())
thisを使って自分自身を指し、最後に自分自身(オブジェクト)を返すのが特徴です。
4. runの使い方と特徴
runは、ある値を使って処理して結果を返すときに使います。
val result = "kotlin".run {
this.uppercase()
}
println(result)
letと似ていますが、thisが使えることと、よりシンプルに処理だけを書きたいときに向いています。
5. alsoの使い方と特徴
alsoは、何かをしてから同じオブジェクトを返したいときに使います。
ログ出力やデバッグなど、「ついでに処理」を追加するのに向いています。
val list = mutableListOf("A", "B").also {
println("リストの中身: $it")
it.add("C")
}
letと違って、最後にit(オブジェクトそのもの)を返します。
6. withの使い方と特徴
withは、あるオブジェクトに対して複数の処理をしたいときに使います。
他のスコープ関数とは違い、拡張関数ではなく普通の関数です。
val sb = StringBuilder()
val result = with(sb) {
append("Hello, ")
append("World!")
toString()
}
println(result)
thisでオブジェクトを参照し、最後に処理結果を返します。
7. スコープ関数の違いを表で整理しよう
スコープ関数を表で比較すると次のようになります。
| 関数 | レシーバ | 戻り値 | 主な使いどころ |
|---|---|---|---|
| let | it | 処理の結果 | 一時的な処理 |
| apply | this | オブジェクト自身 | 初期化 |
| run | this | 処理の結果 | 結果の取得 |
| also | it | オブジェクト自身 | デバッグ |
| with | this | 処理の結果 | 複数の操作 |
8. どのスコープ関数を選ぶべき?
初心者のうちは混乱するかもしれませんが、目的に応じて選ぶと覚えやすくなります。
- 何か一時的な処理をしたい → let
- オブジェクトを作ってすぐに設定 → apply
- 中で値を計算して取得 → run
- ついでの処理やログ出力 → also
- 同じオブジェクトに複数の操作 → with
どれも「自分に合った処理の書き方」を選べるのがKotlinのスコープ関数の魅力です。