Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Kotlin辞典

  1. トップページ
  2. Kotlin辞典
  3. ?: エルビス演算子

?: エルビス演算子

Kotlinの『?:』(エルビス演算子)は、左辺がnullの場合に右辺の値を返す演算子です。nullのときのデフォルト値を簡潔に書けます。右辺に『return』や『throw』を書くことも可能です。

構文
// エルビス演算子(?: )
val length = name?.length ?: 0  // name が null なら 0

// return と組み合わせます。
fun processName(name: String?) {
    val nonNull = name ?: return  // null なら関数を抜けます。
    println(nonNull.uppercase())
}

// throw と組み合わせます。
fun requireName(name: String?): String {
    return name ?: throw IllegalArgumentException("名前は必須です")
}

// チェーンで使います。
val value = a?.b?.c ?: "デフォルト"
構文一覧
構文概要
a ?: ba が null なら b を、null でなければ a を返します。
?: returnnull のとき関数を早期リターンします。
?: throw 例外null のとき例外をスローします。
?: continueループ内で null のとき次の反復に進みます。
?: breakループ内で null のときループを終了します。
サンプルコード
fun getName(id: Int): String? = if (id == 1) "Alice" else null

// エルビス演算子でデフォルト値を返す関数
fun greet(name: String?) {
    val displayName = name ?: "名無し"
    println("こんにちは、$displayName!")
}

// return と組み合わせます(ガード節パターン)
fun processUser(name: String?, age: Int?) {
    val n = name ?: return  // null なら即リターン
    val a = age ?: return
    println("$n($a歳)")
}

// throw と組み合わせます。
fun divide(a: Int, b: Int?): Int {
    val divisor = b ?: throw ArithmeticException("除数が null です")
    return a / divisor
}

fun main() {
    greet("Bob")   // こんにちは、Bob!
    greet(null)    // こんにちは、名無し!

    // 安全呼び出しとエルビス演算子の組み合わせ
    val name1 = getName(1)
    val name2 = getName(99)
    println(name1?.length ?: -1)   // 5
    println(name2?.length ?: -1)   // -1

    // ガード節パターン
    processUser("Alice", 25)    // Alice(25歳)
    processUser(null, 25)       // 何も出力されません
    processUser("Bob", null)    // 何も出力されません

    // throw との組み合わせ
    try {
        println(divide(10, 2))   // 5
        divide(10, null)         // 例外スロー
    } catch (e: ArithmeticException) {
        println("例外: ${e.message}")  // 例外: 除数が null です
    }

    // チェーン呼び出しとエルビス演算子
    data class Address(val city: String?)
    data class User(val address: Address?)
    val user: User? = User(Address(null))
    val city = user?.address?.city ?: "不明"
    println("都市: $city")  // 不明

    // コレクションでの活用
    val names = listOf("Alice", null, "Bob", null, "Carol")
    val result = names.map { it ?: "匿名" }
    println(result)  // [Alice, 匿名, Bob, 匿名, Carol]
}
概要

エルビス演算子は三項演算子の代わりに使えるKotlin独自の演算子です。『name ?: "デフォルト"』はJavaの『name != null ? name : "デフォルト"』と同等ですが、より簡潔に書けます。

右辺に『return』や『throw』を書くことで「nullなら早期リターン」「nullなら例外」のガード節パターンを簡潔に実装できます。これは関数の先頭でのnull検証に非常に有効です。

Nullable型の基本はNullable 型 / ?. 演算子を、強制的なnull排除は!! 非 null アサーションを参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。