0Pricing
Android Academy · レッスン

let、also、スコープ関数

Nullableな値を扱います。

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

スコープ関数とは

スコープ関数を使うと、オブジェクトのコンテキストでコードブロックを実行できます。特に nullable な値を扱うときに、コードを簡潔にできます。

このレッスンでは、null 安全性に最も役立つ2つのスコープ関数である let と also、およびこれらとセーフコール演算子との関係に焦点を当てます。

let 関数

let はブロックを実行し、オブジェクトを it として渡します。ブロックが返した値を返します。

値を変換したり、一時的な名前のスコープを限定したりするときに便利です。

fun main() {
    val length = "Kotlin".let { it.length }
    println(length)  // prints: 6
}

null 安全性のための let

?. と let を組み合わせると、値が null でない場合にだけブロックを実行できます。ブロックは値を it として受け取り、1回だけ実行されます。

値が null の場合、ブロックは完全にスキップされます。

fun main() {
    val name: String? = "Ada"
    name?.let {
        println("Hello, " + it)
    }
}

null の場合はスキップ

レシーバーが null の場合、?.let は何もしません。ブロックは実行されません。

name が null なので、このプログラムは何も出力しません。

fun main() {
    val name: String? = null
    name?.let {
        println("Hello, " + it)
    }
}

it に名前を付ける

it の代わりに、より分かりやすい名前をパラメーターに付けることができます。長いブロックでは、これにより読みやすくなります。

矢印を使って明示的に名前を付けます。

val name: String? = "Bo"
name?.let { value ->
    println(value.uppercase())
}

also 関数

also もオブジェクトを it として渡しますが、ブロックの結果ではなく元のオブジェクトを返します。

値を変更せずにチェーン内で使い続けながら、ログ出力などの副作用を追加するのに適しています。

fun main() {
    val n = 5.also { println("got " + it) }
    println(n)  // prints: 5
}

let と also の戻り値

重要な違いは、let がブロックの結果を返すのに対し、also は元のオブジェクトを返すことです。

値を変換するときは let、値を変更せずに途中で確認するときは also を選びます。

val a = "hi".let { it.length }   // a = 2 (Int)
val b = "hi".also { it.length }  // b = "hi" (String)

ログ出力のための also

also はオブジェクトを返すため、チェーンの途中で値を確認する目的で組み込めます。

ここでは、nullable な値が存在する場合にだけログへ出力し、その後もその値を使い続けます。

fun main() {
    val token: String? = "abc"
    val result = token?.also { println("token: " + it) }
    println(result)
}

Elvis と let

?.let と Elvis 演算子を組み合わせると、値が null の場合の代替処理を指定できます。

値が存在する場合はブロックが結果を生成し、null の場合は Elvis 演算子の右辺が処理します。

fun main() {
    val raw: String? = null
    val out = raw?.let { it.trim() } ?: "empty"
    println(out)  // prints: empty
}

スコープ関数の選び方

null 安全性のために、ブロック内で null でない値を変換または使用したい場合は let を使います。副作用を追加しつつ元のオブジェクトを保持したい場合は also を使います。

どちらもセーフコール演算子と自然に組み合わせられるため、null によるクラッシュを防げます。

user?.let { save(it) }      // transform/use
user?.also { log(it) }      // side effect, keep user

組み合わせた例

このプログラムでは、?.let でメッセージを作成し、Elvis 演算子で代替値に切り替えます。Kotlin で null 安全な処理を日常的に行う流れが分かります。

明示的な null チェックはありませんが、完全に安全です。

fun main() {
    val city: String? = "Goreme"
    val label = city?.let { "City: " + it } ?: "Unknown"
    println(label)
}

理解度チェック

let と also の理解度を確認しましょう。

まとめ

スコープ関数は、オブジェクトのコンテキストでブロックを実行します。let はオブジェクトを it として渡し、ブロックの結果を返します。also は it を渡し、元のオブジェクトを返します。

?.let を使うと、値が null でない場合にだけ処理できます。次は、これらの考え方を組み合わせて NullPointerException を完全に防ぐ方法を学びます。

よくある質問

「let、also、スコープ関数」レッスンは無料ですか?

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

「let、also、スコープ関数」で何を学びますか?

Nullableな値を扱います。 ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「let、also、スコープ関数」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. Nullable型とNon-Null型
  2. 安全呼び出しとElvis
  3. let、also、スコープ関数
  4. NullPointerExceptionを防ぐ
← Android Academyに戻る