Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
let でスコープ限定
Kotlinの『?.let』は、Nullable型の値がnullでない場合のみラムダを実行するパターンです。nullチェックと処理をワンライナーで書けます。スコープ内では変数『it』でnon-null値にアクセスできます。
構文
// ?.let で null のときはスキップします。
val name: String? = "Alice"
name?.let {
println(it.length) // null でなければ実行されます。
}
// 結果を受け取ります(null の場合は null が入ります)。
val result: Int? = name?.let { it.length * 2 }
// if null チェックとの比較
if (name != null) {
println(name.length) // スマートキャスト
}
// 上記と同等:
name?.let { println(it.length) }
構文一覧
| 構文 | 概要 |
|---|---|
| value?.let { it } | value が null でなければラムダを実行し、結果を返します。null なら null を返します。 |
| value?.let { v -> } | 引数名を明示して受け取ります。 |
| ?.let と ?: の組み合わせ | null 時のデフォルト値を設定します(value?.let { 処理 } ?: デフォルト)。 |
| ?.also { it } | let と似ていますが、レシーバー自身を返します(副作用に使います)。 |
サンプルコード
data class User(val name: String, val email: String?)
fun findUser(id: Int): User? = if (id == 1) User("Alice", "alice@example.com") else null
fun main() {
// 基本的な ?.let の使い方
val name: String? = "Kotlin"
name?.let {
println("長さ: ${it.length}") // 長さ: 6
println("大文字: ${it.uppercase()}") // 大文字: KOTLIN
}
// null の場合はスキップされます。
val nullName: String? = null
nullName?.let { println("これは実行されません") }
println("null をスキップしました") // null をスキップしました
// 結果を受け取ります。
val length: Int? = name?.let { it.length * 2 }
println("2倍の長さ: $length") // 2倍の長さ: 12
// ?:(エルビス)と組み合わせます。
val nullLength: Int = nullName?.let { it.length } ?: -1
println("null 時のデフォルト: $nullLength") // -1
// ネストした Nullable をチェーンで処理します。
val user: User? = findUser(1)
user?.let { u ->
u.email?.let { email ->
println("メール: $email") // メール: alice@example.com
}
}
// findUser(99) は null なのでスキップされます。
findUser(99)?.let { println("ユーザー: ${it.name}") }
println("存在しないユーザーをスキップしました")
// リストの null 要素を処理します。
val names: List<String?> = listOf("Alice", null, "Bob", null, "Carol")
names.forEach { it?.let { name -> println(name) } }
}
概要
『?.let』はKotlinで最もよく使われるNullチェックパターンの1つです。『if (value != null) { ... }』と同等ですが、スコープ関数として扱えるため、結果を変数に代入したりチェーンしたりできます。
スコープ内のパラメーター名は既定で『it』ですが、『?.let { user -> ... }』のように名前を付けるとネスト時に読みやすくなります。
Nullable型の基本はNullable 型 / ?. 演算子を、スコープ関数全般はletを参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。