Caution

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

Kotlin辞典

when 式

『when』は Java の switch 文を大幅に強化した多分岐式です。値の比較だけでなく、型チェック・範囲チェック・任意の条件式にも対応しており、式として値を返すことができます。

構文
// 引数ありの when 式です。
when (値) {
    パターン1 -> 処理または値
    パターン2, パターン3 -> 処理または値
    in 範囲 -> 処理または値
    is 型 -> 処理または値
    else -> 処理または値
}

// 引数なし(条件式を直接書く)の when です。
when {
    条件1 -> 処理
    条件2 -> 処理
    else -> 処理
}
構文一覧
構文概要
->パターンと処理を区切る矢印です。右辺はブロックにもできます。
パターン1, パターン2カンマで区切ることで複数のパターンをまとめて処理できます。
in 範囲値が指定した範囲・コレクションに含まれるか調べます。
is 型型チェックを行います。マッチした後はスマートキャストが有効になります。
elseどのパターンにも一致しない場合の処理です。式として使う場合は必須です。
サンプルコード
fun main() {
    val day = 3

    // 基本的な when です。
    val dayName = when (day) {
        1 -> "月曜日"
        2 -> "火曜日"
        3 -> "水曜日"   // day が 3 なので『水曜日』が選ばれます。
        4 -> "木曜日"
        5 -> "金曜日"
        6, 7 -> "週末"  // 複数の値をまとめられます。
        else -> "不明"
    }
    println(dayName) // 『水曜日』と出力されます。

    // 範囲チェックの例です。
    val score = 78
    val grade = when (score) {
        in 90..100 -> "A"
        in 70..89 -> "B"  // 78 はこの範囲に含まれます。
        in 60..69 -> "C"
        else -> "D"
    }
    println(grade) // 『B』と出力されます。

    // 型チェックとスマートキャストの例です。
    fun describe(obj: Any): String = when (obj) {
        is Int -> "整数: ${obj * 2}"      // obj は自動的に Int として使えます。
        is String -> "文字列: ${obj.length} 文字"
        is List<*> -> "リスト: ${obj.size} 件"
        else -> "その他"
    }
    println(describe(42))         // 『整数: 84』と出力されます。
    println(describe("Kotlin"))   // 『文字列: 6 文字』と出力されます。

    // 引数なし when(条件式を直接書く)の例です。
    val temperature = 30
    val comment = when {
        temperature >= 35 -> "猛暑日です。"
        temperature >= 30 -> "真夏日です。" // こちらが選ばれます。
        temperature >= 25 -> "夏日です。"
        else -> "過ごしやすい気温です。"
    }
    println(comment) // 『真夏日です。』と出力されます。
}
概要

『when』は Kotlin で最もよく使われる制御構文の一つです。式として使う場合は『else』ブランチが必須ですが、sealed class や enum class のように取り得るすべての値が網羅されている場合はコンパイラが省略を許可します。sealed class との組み合わせは特に強力で、分岐漏れをコンパイル時に検出できます。

sealed class との組み合わせ方は『sealed class / sealed interface』を参照してください。範囲(in)の詳細は『範囲・for ループ』を参照してください。

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