0Pricing
Kotlin Academy · レッスン

also:レシーバーを変更せず副作用を実行する

ログ出力、デバッグ、副作用だけを目的とする処理にalsoを使用します。

「also:レシーバーを変更せず副作用を実行する」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

alsoの概要

alsoはレシーバーをitとしてブロックを実行し、レシーバーを変更せずに返します。チェーンを中断せずに、ログ出力、デバッグ、検証などの副作用を実行するのに最適です。

alsoの基本

also { ... }は副作用を実行し、同じ値を返すため、呼び出しを自然につなげられます。

fun main() {
    val nums = listOf(1, 2, 3, 4)
        .also { println("input: $it") }
        .filter { it % 2 == 0 }
        .also { println("filtered: $it") }
    println(nums)
}

ログ出力にalsoを使う

パイプラインの途中にログ出力を追加しても、処理の流れを壊しません。

fun main() {
    val processed = "  Hello, Kotlin!  "
        .also { println("raw: '$it'") }
        .trim()
        .also { println("trimmed: '$it'") }
        .uppercase()
    println(processed)
}

デバッグにalsoを使う

リファクタリング中に中間状態を確認するにはalsoを使用します。後から削除してもチェーンを変更せずに済みます。

fun main() {
    val sum = (1..5).toList()
        .also { println("list: $it") }
        .sum()
        .also { println("sum: $it") }
    println("final: $sum")
}

alsoとapplyの違い

applyはthisを使用します(代入に適しています)。alsoはitを使用します(明示的な参照や副作用に適しています)。

class Counter {
    var value: Int = 0
}
fun main() {
    val c = Counter().apply { value = 10 } // uses this implicitly
    val d = Counter().also { it.value = 10 } // uses it explicitly
    println("${c.value} / ${d.value}")
}

初期化時の副作用にalsoを使う

オブジェクトの作成中に、プロパティの設定以外の処理を実行したい場合に便利です。

class Repository {
    val cache = mutableMapOf<String, String>()
    fun init() = println("Repository initialized")
}
fun main() {
    val r = Repository().also { it.init() }
    r.cache["key"] = "value"
    println(r.cache)
}

alsoは元の値を返す

レシーバーは変更されずにそのまま渡されるため、簡単にチェーンをつなげられます。

fun main() {
    val len = "Hello".also { println("got: $it") }.length
    println(len) // 5
}

検証にalsoを使う

チェーンの途中でアサーションを実行できます。

fun main() {
    val n = listOf(1, 2, 3, 4)
        .filter { it > 0 }
        .also { require(it.isNotEmpty()) { "must have positives" } }
        .sum()
    println(n)
}

alsoとletの組み合わせ

同じパイプライン内で、副作用にはalsoを、変換にはletを使用します。

fun main() {
    val raw: String? = "  42  "
    val n = raw
        ?.also { println("raw: '$it'") }
        ?.let { it.trim().toIntOrNull() }
        ?.also { println("parsed: $it") }
    println(n)
}

コレクションへの追加にalsoを使う

生成したオブジェクトをリストにインラインで追加できます。

class User(val name: String)
fun main() {
    val users = mutableListOf<User>()
    val ada = User("Ada").also { users.add(it) }
    val ben = User("Ben").also { users.add(it) }
    println(users.map { it.name })
}

alsoを使う場面

ログ出力、検証、登録などの副作用が必要で、元の値をそのまま次へ渡したい場合は、alsoを使用します。

fun main() {
    val total = listOf(10, 20, 30, 40, 50)
        .also { println("count: ${it.size}") }
        .filter { it >= 30 }
        .also { println("kept: $it") }
        .sum()
    println("total: $total")
}

アンチパターン:再代入にalsoを使う

実際には変換が必要な場合にalsoを使わないでください。その場合はletまたはrunを使用します。

fun main() {
    val name = "ada"
    // BAD: also returns receiver, so upper is wrong
    // val upper = name.also { it.uppercase() } // upper == "ada"
    val upper = name.let { it.uppercase() }
    println(upper) // ADA
}

クイックチェック

ブロックの実行後、alsoはどの値を返しますか?

振り返り

alsoはitを使って副作用のブロックを実行し、レシーバーを返します。値を変更せずに確認したい場合のログ出力、デバッグ、検証、登録などに使用します。変換には、代わりにletまたはrunを使用してください。

よくある質問

「also:レシーバーを変更せず副作用を実行する」レッスンは無料ですか?

はい。「also:レシーバーを変更せず副作用を実行する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「also:レシーバーを変更せず副作用を実行する」で何を学びますか?

ログ出力、デバッグ、副作用だけを目的とする処理にalsoを使用します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「also:レシーバーを変更せず副作用を実行する」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. applyとwith:設定して返す
  2. letとrun:変換とスコープ
  3. also:レシーバーを変更せず副作用を実行する
  4. 適切なスコープ関数の選び方:判断ガイド
← Kotlin Academyに戻る