Nullableレシーバーで使うlet、also、run
スコープ関数を使い、値がnullでない場合にだけコードを実行します。
「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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Nullable型と?修飾子
- 実際のコードで使う安全呼び出し?.とElvis ?:
- Nullableレシーバーで使うlet、also、run
- !!演算子:避けるべき場面と理由