※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

8-2. when 式

2023年7月29日

概要

when 式でも、if/else のように条件式を書いて、それの結果によって処理の流れを変えることができます。
3つ以上の分岐がある場合ような条件式とともに用いるのが適しています。
ほかのプログラムミング言語の switch 文に近い形です。

書式

when の後に括弧 ( ) で条件式を記載し、そのあとに条件式が満たす値を記載し -> の記号に続け、それを満たした場合に実行する分を続けます。
最後にどれも満たさない場合の else の分岐を記載します。

when (条件式) {
	条件1 -> 文1
	条件2 -> 文2
	条件3 -> {
		文3
		}
	else -> 文4
}

使用例

基本的な使い方の例

fun main (){
    val dayOfWeek = 3

    when (dayOfWeek) {
        1 -> println("月曜日")
        2 -> println("火曜日")
        3 -> println("水曜日")
        4 -> println("木曜日")
        5 -> println("金曜日")
        6 -> println("土曜日")
        7 -> println("日曜日")
        else -> println("無効な曜日")
    }
}

出力

水曜日

Kotlin Playground で実行

複数の条件を 1 つの分岐にまとめる

カンマ (,) を使用して、複数の条件を 1 つの分岐にまとめることができます。

fun main (){
    val dayOfWeek = 3

    when (dayOfWeek) {
        1, 2, 3, 4, 5 -> println("平日")
        6, 7 -> println("週末")
        else -> println("無効な曜日")
    }
}

出力

平日

Kotlin Playground で実行

範囲条件の使用

in 演算子を使用して、範囲条件を指定することもできます。

fun main (){
    val score = 85

    when (score) {
        in 90..100 -> println("優秀です!")
        in 80..89 -> println("よくできました!")
        in 70..79 -> println("もう少し頑張りましょう!")
        else -> println("不合格です。")
    }
}

出力

よくできました!

Kotlin Playground で実行

式としての when

if/else 式と同様に、when 式も値を返すことができます。

fun main (){
    val dayOfWeek = 5
    val message = when (dayOfWeek) {
        1 -> "月曜日: 週の始まりです"
        5 -> "金曜日: 週末が待ち遠しい!"
        else -> "平日頑張ろう"
    }
    println(message)
}

出力

金曜日: 週末が待ち遠しい!

Kotlin Playground で実行

型チェックによる分岐

is 演算子を使用して、変数の型をチェックし、 それに応じて分岐することができます。

fun main (){
    fun describe(obj: Any): String =
        when (obj) {
            is String -> "文字列: $obj"
            is Int -> "数値: $obj"
            is Boolean -> "真偽値: $obj"
            else -> "不明な型"
        }

    println(describe("Hello"))  // 文字列: Hello
    println(describe(123))    // 数値: 123
    println(describe(true))   // 真偽値: true
}

出力

文字列: Hello
数値: 123
真偽値: true

Kotlin Playground で実行

引数なし when

when 式は、引数なしで使用するこもできます。この場合、 各分岐の条件はブール式になり、 真の条件に対応する分岐が実行されます。

fun main (){
    val x = 5
    val y = 10

    when {
        x > y -> println("x は y より大きい")
        x < y -> println("x は y より小さい")
        else -> println("x と y は等しい")
    }
}

出力

x は y より小さい

Kotlin Playground で実行