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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Nullable型とNon-Null型
- 安全呼び出しとElvis
- let、also、スコープ関数
- NullPointerExceptionを防ぐ