Kotlinのスコープ関数について

採用はこちら

Kotlinのスコープ関数(Scope Functions)は、あるオブジェクトを特定のスコープ内で操作するための関数です。

コードの可読性を高めたり、オブジェクト操作をまとめたりする目的で使われます。

代表的なスコープ関数は次の5つです。

  • let
  • run
  • with
  • apply
  • also

これらの関数は似ていますが、次の2つの観点で違いがあります。

  1. オブジェクトをどのように参照するか
  2. スコープ関数の戻り値が何になるか

この2点を理解すると、それぞれの使い分けが明確になります。

目次

スコープ関数の基本整理

スコープ関数は次のように分類できます。

関数オブジェクト参照戻り値
letitラムダ式の結果
runthisラムダ式の結果
withthisラムダ式の結果
applythisオブジェクト自身
alsoitオブジェクト自身

ここで重要なのが thisit の違いです。

  • this
    オブジェクトをレシーバとして扱うため、メンバーに直接アクセスできます。
  • it
    ラムダの引数としてオブジェクトを受け取ります。

let

特徴

  • オブジェクト参照:it
  • 戻り値:ラムダ式の結果

基本形

obj.let {
    // it が obj
}

使用例

val result = "123".let {
    it.toInt()
}

この場合、resultには 123 が格納されます。

よく使われる場面

letnullチェックと組み合わせて使われることが多い関数です。

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あるオブジェクトをレシーバとして、複数の処理をまとめて書きたい場合に使われます。

また、applyalso と違い、戻り値は 元のオブジェクトではなくラムダの結果になります。

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点を基準に考えると分かりやすくなります。

オブジェクトをどう扱いたいか

参照方法関数
thisrun / with / apply
itlet / also

戻り値として何が必要か

戻り値関数
ラムダ結果let / run / with
元オブジェクトapply / also

この整理を理解しておくと、どの関数を使うべきか判断しやすくなります。

スコープ関数使用時の注意点

スコープ関数は便利ですが、多用すると可読性が下がる場合があります。

特に次のケースでは注意が必要です。

ネストのしすぎ

user?.let {
    it.address?.run {
        city?.also {
            println(it)
        }
    }
}

このようにスコープ関数を入れ子にすると、thisit が何を指しているのか分かりづらくなることがあります。

そのため、必要以上にネストさせないことが重要です。

まとめ

Kotlinのスコープ関数は、オブジェクト操作を簡潔に記述するための機能です。

5つの関数は主に次の2つの違いで整理できます。

  • オブジェクト参照方法(this / it
  • 戻り値(ラムダ結果 / オブジェクト)
関数参照戻り値
letitラムダ結果
runthisラムダ結果
withthisラムダ結果
applythisオブジェクト
alsoitオブジェクト

この整理を理解しておくと、Kotlinのコードを読み書きする際にスコープ関数の役割が把握しやすくなります。

以上、Kotlinのスコープ関数についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次