Kotlinのスコープ関数(Scope Functions)は、あるオブジェクトを特定のスコープ内で操作するための関数です。
コードの可読性を高めたり、オブジェクト操作をまとめたりする目的で使われます。
代表的なスコープ関数は次の5つです。
letrunwithapplyalso
これらの関数は似ていますが、次の2つの観点で違いがあります。
- オブジェクトをどのように参照するか
- スコープ関数の戻り値が何になるか
この2点を理解すると、それぞれの使い分けが明確になります。
スコープ関数の基本整理
スコープ関数は次のように分類できます。
| 関数 | オブジェクト参照 | 戻り値 |
|---|---|---|
| let | it | ラムダ式の結果 |
| run | this | ラムダ式の結果 |
| with | this | ラムダ式の結果 |
| apply | this | オブジェクト自身 |
| also | it | オブジェクト自身 |
ここで重要なのが this と it の違いです。
- this
オブジェクトをレシーバとして扱うため、メンバーに直接アクセスできます。 - it
ラムダの引数としてオブジェクトを受け取ります。
let
特徴
- オブジェクト参照:
it - 戻り値:ラムダ式の結果
基本形
obj.let {
// it が obj
}
使用例
val result = "123".let {
it.toInt()
}
この場合、resultには 123 が格納されます。
よく使われる場面
let は nullチェックと組み合わせて使われることが多い関数です。
val name: String? = "Taro"
name?.let {
println(it)
}
このコードは「name が null でない場合だけ処理する」という意味になります。
run
特徴
- オブジェクト参照:
this - 戻り値:ラムダ式の結果
基本形
obj.run {
// this が obj
}
使用例
val result = "hello".run {
length
}
この場合、resultには 5 が格納されます。
this を使うため、メンバーを直接呼び出せます。
runのもう一つの使い方
run はオブジェクトなしで使うこともできます。
val result = run {
val x = 10
val y = 20
x + y
}
このように、スコープを限定したブロックとして使うことも可能です。
with
特徴
- オブジェクト参照:
this - 戻り値:ラムダ式の結果
- 拡張関数ではない
基本形
with(obj) {
// this が obj
}
使用例
val person = Person()
with(person) {
name = "Taro"
age = 20
}
with は あるオブジェクトをレシーバとして、複数の処理をまとめて書きたい場合に使われます。
また、apply や also と違い、戻り値は 元のオブジェクトではなくラムダの結果になります。
apply
特徴
- オブジェクト参照:
this - 戻り値:オブジェクト自身
基本形
obj.apply {
}
使用例
val person = Person().apply {
name = "Taro"
age = 20
}
この場合、person には設定済みの Person オブジェクトが代入されます。
主な用途
apply は オブジェクトの設定や初期化をまとめる場合に適しています。
例えば、オブジェクト生成と設定を同時に書くケースです。
also
特徴
- オブジェクト参照:
it - 戻り値:オブジェクト自身
基本形
obj.also {
}
使用例
val numbers = mutableListOf(1, 2, 3).also {
println(it)
}
このコードでは numbers はリストのまま保持されつつ、途中でログ出力を行っています。
主な用途
also は 処理の途中で副作用を追加したい場合に使われることが多いです。
例
- ログ出力
- デバッグ
- 値の検証
スコープ関数の使い分け
スコープ関数を選ぶ際は、次の2点を基準に考えると分かりやすくなります。
オブジェクトをどう扱いたいか
| 参照方法 | 関数 |
|---|---|
| this | run / with / apply |
| it | let / also |
戻り値として何が必要か
| 戻り値 | 関数 |
|---|---|
| ラムダ結果 | let / run / with |
| 元オブジェクト | apply / also |
この整理を理解しておくと、どの関数を使うべきか判断しやすくなります。
スコープ関数使用時の注意点
スコープ関数は便利ですが、多用すると可読性が下がる場合があります。
特に次のケースでは注意が必要です。
ネストのしすぎ
user?.let {
it.address?.run {
city?.also {
println(it)
}
}
}
このようにスコープ関数を入れ子にすると、this や it が何を指しているのか分かりづらくなることがあります。
そのため、必要以上にネストさせないことが重要です。
まとめ
Kotlinのスコープ関数は、オブジェクト操作を簡潔に記述するための機能です。
5つの関数は主に次の2つの違いで整理できます。
- オブジェクト参照方法(
this/it) - 戻り値(ラムダ結果 / オブジェクト)
| 関数 | 参照 | 戻り値 |
|---|---|---|
| let | it | ラムダ結果 |
| run | this | ラムダ結果 |
| with | this | ラムダ結果 |
| apply | this | オブジェクト |
| also | it | オブジェクト |
この整理を理解しておくと、Kotlinのコードを読み書きする際にスコープ関数の役割が把握しやすくなります。
以上、Kotlinのスコープ関数についてでした。
最後までお読みいただき、ありがとうございました。










