Kotlin Academy · レッスン

Nullableレシーバーで使うlet、also、run

スコープ関数を使い、値がnullでない場合にだけコードを実行します。

レッスン 3/413 ステップ

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

nullable 値とスコープ関数

スコープ関数 let、also、run は、セーフコール ?. と組み合わせると、レシーバーが非 null の場合にだけブロックを実行できます。

セーフコールと let

obj?.let { ... } は、obj が非 null の場合にだけブロックを実行します。ブロック内では、it が非 null の値を参照します。

fun main() {
    val name: String? = "Kotlin"
    name?.let {
        println("Length: ${it.length}")
        println("Upper: ${it.uppercase()}")
    }
}

null の場合 let はブロックをスキップする

レシーバーが null の場合、let ブロック全体がスキップされます。

fun main() {
    val name: String? = null
    val result = name?.let {
        println("never printed")
        it.length
    }
    println(result) // null
}

let は値を返す

let はブロックの最後の式を返します。デフォルト値を指定する Elvis へ連結できます。

fun main() {
    val raw: String? = "  hello "
    val cleaned = raw?.let { it.trim().uppercase() } ?: "(empty)"
    println(cleaned) // HELLO
}

副作用のための also

also は副作用のためにブロックを実行し、元のレシーバーを返します。連結中のログ出力に適しています。

fun main() {
    val name: String? = "Alice"
    val len = name?.also { println("Processing: $it") }?.length
    println("len = $len")
}

also は値を保持する

let とは異なり、also はレシーバーを変更せずに返します。変換せずに値を確認したい場合に使用してください。

fun main() {
    val items: List<Int>? = listOf(1, 2, 3)
    items?.also { println("Got list of size ${it.size}") }
           ?.forEach { println(it) }
}

セーフコールと run

obj?.run { ... } は、レシーバーを this に束縛してブロックを実行します。it. 接頭辞なしでメンバーにアクセスしたい場合に使用してください。

fun main() {
    val name: String? = "Kotlin"
    val info = name?.run {
        "len=$length upper=${uppercase()}"
    }
    println(info)
}

let と run の違い

let は it(ラムダ引数)を使い、run は this(レシーバー)を使います。読みやすいほうを選択してください。

class User(val name: String, val age: Int)
fun main() {
    val user: User? = User("Ada", 35)
    user?.let { "${it.name} age ${it.age}" }.also(::println)
    user?.run { "$name age $age" }.also(::println)
}

複数のスコープの連結

パイプライン全体でスコープ関数を連結すると、段階的な変換とログ出力を行えます。

fun main() {
    val raw: String? = "  hello  "
    val result = raw
        ?.also { println("raw: '$it'") }
        ?.let { it.trim() }
        ?.also { println("trimmed: '$it'") }
        ?.uppercase()
    println(result) // HELLO
}

takeIf と let

takeIf(フィルター)と let を組み合わせると、述語に基づいて処理を実行できます。

fun main() {
    val name: String? = "Kotlin"
    name?.takeIf { it.length > 3 }
        ?.let { println("Long name: $it") }
}

アンチパターン:ネストした if

スコープ関数を使わない場合:

fun main() {
    val name: String? = "Alice"
    // OLD WAY:
    if (name != null) {
        val upper = name.uppercase()
        println(upper)
    }
    // NEW WAY:
    name?.let { println(it.uppercase()) }
}

簡単な確認

レシーバーを変更せずに返し、主に副作用のために使用するスコープ関数はどれですか?

まとめ

?. と let(ブロックが値を返し、it を使用)、run(ブロックが値を返し、this を使用)、または also(レシーバーを返し、副作用に使用)を組み合わせてください。いずれもレシーバーが null の場合は実行をスキップします。

無料で開始

AI チューターと学ぶ Kotlin — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「Nullableレシーバーで使うlet、also、run」レッスンは無料ですか?

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

「Nullableレシーバーで使うlet、also、run」で何を学びますか?

スコープ関数を使い、値がnullでない場合にだけコードを実行します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「Nullableレシーバーで使うlet、also、run」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. Nullable型と?修飾子
  2. 実際のコードで使う安全呼び出し?.とElvis ?:
  3. Nullableレシーバーで使うlet、also、run
  4. !!演算子:避けるべき場面と理由
← Kotlin Academyに戻る