Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Kotlin辞典

also

Kotlinのスコープ関数『also』は、オブジェクトに対して副作用(ログ出力・デバッグ・追加処理)を挿入したいときに使います。ブロック内では『it』でオブジェクトを参照でき、戻り値はレシーバー自身です。

構文
// also の基本形
val result = オブジェクト.also {
    // it = オブジェクト
    println(it)      // 副作用(ログなど)
}
// result はオブジェクト自身
構文一覧
スコープ関数コンテキスト参照戻り値用途
also { }itレシーバー自身副作用(ログ・デバッグ)の挿入に使います。
apply { }this(省略可)レシーバー自身オブジェクトの設定・初期化に使います。
let { }itラムダの結果null チェックや変換チェーンに使います。
run { }this(省略可)ラムダの結果オブジェクトのセットアップと計算を組み合わせます。
サンプルコード
fun main() {
    // also でメソッドチェーンの途中にログを挿入します。
    val numbers = mutableListOf(1, 2, 3)
        .also { println("変換前: $it") }  // 変換前: [1, 2, 3]
        .map { it * 2 }
        .also { println("変換後: $it") }  // 変換後: [2, 4, 6]

    println(numbers)  // [2, 4, 6]

    // also は自身を返すため、処理を邪魔せずログを差し込めます。
    val text = "Hello, Kotlin!"
        .also { println("文字数: ${it.length}") }  // 文字数: 14
        .uppercase()
    println(text)  // HELLO, KOTLIN!

    // バリデーションの挿入にも使えます。
    data class User(val name: String, val age: Int)

    fun createUser(name: String, age: Int): User {
        return User(name, age).also {
            require(it.age >= 0) { "年齢は0以上が必要です" }
            println("ユーザー作成: $it")
        }
    }

    val user = createUser("Bob", 25)
    println(user)
    // ユーザー作成: User(name=Bob, age=25)
    // User(name=Bob, age=25)
}
概要

『also』の最大の特徴は、処理の流れを変えずに副作用だけを追加できる点です。メソッドチェーンの途中でデバッグログを挿入したり、バリデーションを追加するときに活躍します。

『also』と『apply』はどちらもレシーバー自身を返しますが、コンテキスト参照が『it』(also)と『this』(apply)で異なります。オブジェクトの外からの操作は『also』、オブジェクト自身の設定は『apply』が適しています。

オブジェクトの初期化にはapplyを、null チェックにはletを参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。