Kotlinのswitch文について

採用はこちら

Kotlinには、Javaのような switch 文はありません

その代わりに、Kotlinでは when を使って条件分岐を書きます。

ただし、when は単なる switch の代用品ではありません。

Java の switch よりも表現力が高く、値による分岐だけでなく、複数条件・範囲判定・型判定・条件式による分岐まで書けます。

さらに、値を返す式として使えるのも大きな特徴です。

つまり、Kotlinでは「switchがない」というより、switchより柔軟な when があると理解すると分かりやすいです。

目次

Kotlinではswitchの代わりに when を使う

Javaでは、値による分岐に switch を使います。

switch (x) {
    case 1:
        System.out.println("one");
        break;
    case 2:
        System.out.println("two");
        break;
    default:
        System.out.println("other");
}

Kotlinでは、これに近い処理を when で書きます。

when (x) {
    1 -> println("one")
    2 -> println("two")
    else -> println("other")
}

対応関係は次のようになります。

  • switchwhen
  • case条件 -> 処理
  • defaultelse

また、Kotlinでは break は不要 です。

基本構文

もっとも基本的な形は次の通りです。

val number = 2

when (number) {
    1 -> println("1です")
    2 -> println("2です")
    3 -> println("3です")
    else -> println("それ以外です")
}

number の値に応じて、対応する処理だけが実行されます。

break が不要な理由

Java の switch では、break を書き忘れると次の case に処理が流れる、いわゆるフォールスルーが起こることがありました。

一方、Kotlin の when では、一致した分岐だけが実行されて終了します。

val x = 1

when (x) {
    1 -> println("one")
    2 -> println("two")
    else -> println("other")
}

この場合、x1 なら "one" だけが実行され、2else の処理には進みません。

そのため、break は必要ありません。

複数の値をまとめて書ける

同じ処理を複数の値に対して行いたいときは、カンマ区切りでまとめて書けます。

val score = 90

when (score) {
    100, 90, 80 -> println("高得点です")
    70, 60 -> println("合格です")
    else -> println("再挑戦です")
}

Java の switch のように複数の case を並べる代わりに、Kotlinではこのように簡潔に書けます。

when は文としても式としても使える

Kotlin の when は、処理を分岐するための文としても、値を返す式としても使えます。

文として使う場合

val signal = "red"

when (signal) {
    "red" -> println("止まる")
    "yellow" -> println("注意")
    "green" -> println("進む")
    else -> println("不明")
}

これは単に処理を分けているだけです。

式として使う場合

val signal = "green"

val action = when (signal) {
    "red" -> "止まる"
    "yellow" -> "注意する"
    "green" -> "進む"
    else -> "不明"
}

println(action)

この場合、when 全体が1つの値を返し、その結果が action に代入されます。

Kotlinらしい書き方では、この「条件によって値を返す」使い方がとてもよく使われます。

範囲で判定できる

when は、単なる値の一致だけでなく、範囲で判定することもできます。

val age = 25

when (age) {
    in 0..12 -> println("子ども")
    in 13..19 -> println("ティーン")
    in 20..64 -> println("大人")
    else -> println("シニア")
}

ここで使っている in は、「その値がその範囲に含まれているか」を調べるための書き方です。

範囲外も判定できる

!in を使えば、「その範囲に含まれない」という条件も書けます。

val number = 150

when (number) {
    !in 0..100 -> println("範囲外です")
    else -> println("範囲内です")
}

型で判定できる

Kotlin の when は、によって分岐することもできます。

これは Java の従来の switch にはなかった大きな特徴です。

fun checkType(value: Any) {
    when (value) {
        is Int -> println("Int型です")
        is String -> println("String型です")
        is Boolean -> println("Boolean型です")
        else -> println("不明な型です")
    }
}

is は「その型であるかどうか」を調べるための演算子です。

条件式ベースでも書ける

when は、比較対象となる値を書かずに使うこともできます。

この場合は、if / else if / else に近い使い方になります。

val age = 20

when {
    age < 13 -> println("子ども")
    age < 20 -> println("未成年")
    else -> println("成人")
}

この形は、単純な値の一致ではなく、複雑な条件式で分岐したいときに便利です。

分岐の中で複数行の処理も書ける

1つの分岐で複数の処理を行いたい場合は、波括弧 {} を使います。

val mode = "edit"

when (mode) {
    "view" -> {
        println("閲覧モードです")
        println("編集はできません")
    }
    "edit" -> {
        println("編集モードです")
        println("保存できます")
    }
    else -> {
        println("不明なモードです")
    }
}

else が必要な場合と不要な場合

ここは少し大事なポイントです。

when式として使う場合、Kotlin は「必ずどれか1つの結果が返る」ことを求めます。

そのため、すべてのケースを網羅していないなら else が必要です。

val x = 3

val result = when (x) {
    1 -> "one"
    2 -> "two"
    else -> "other"
}

このように else があると、どの値が来ても必ず結果を返せます。

一方で、コンパイラが「全パターンを網羅している」と判断できる場合は、else が不要になることがあります。

代表例は、enum classsealed classBoolean などです。

enum の例

enum class Direction {
    NORTH, SOUTH, EAST, WEST
}

fun move(direction: Direction) {
    when (direction) {
        Direction.NORTH -> println("北へ移動")
        Direction.SOUTH -> println("南へ移動")
        Direction.EAST -> println("東へ移動")
        Direction.WEST -> println("西へ移動")
    }
}

この場合、Direction のすべての値を扱っているので else は不要です。

Boolean の例

val flag = true

val result = when (flag) {
    true -> "YES"
    false -> "NO"
}

これも Boolean の取りうる値をすべて網羅しているため、else は不要です。

when は単なる値比較だけではない

when (対象) と書くと、Java の switch のように「決まった値との一致だけを調べるもの」に見えるかもしれません。

しかし実際には、Kotlin の when はもっと柔軟です。

たとえば次のような条件を書けます。

  • 値の一致
  • 複数の値
  • in / !in による範囲判定
  • is / !is による型判定

例を分けると分かりやすいです。

値による分岐

when (x) {
    0 -> println("zero")
    1 -> println("one")
    else -> println("other")
}

範囲による分岐

when (x) {
    in 1..10 -> println("1〜10")
    else -> println("それ以外")
}

型による分岐

when (value) {
    is String -> println("文字列です")
    is Int -> println("整数です")
    else -> println("その他です")
}

この点で、whenswitch よりかなり表現力があります。

Javaのswitchとの主な違い

Kotlin の when と Java の switch の違いを整理すると、次のようになります。

Kotlin の when

  • switch の代わりに使う
  • break が不要
  • フォールスルーしない
  • 式として値を返せる
  • 複数の値をまとめられる
  • 範囲判定ができる
  • 型判定ができる
  • 網羅性チェックがある

Java の従来の switch

  • 値による分岐が中心
  • break が必要だった
  • フォールスルーに注意が必要
  • Kotlin の when ほど柔軟ではない

実務でよくある使い方

ステータス文字列の変換

fun getStatusMessage(status: String): String {
    return when (status) {
        "draft" -> "下書きです"
        "published" -> "公開中です"
        "archived" -> "アーカイブ済みです"
        else -> "不明なステータスです"
    }
}

点数の判定

fun judgeScore(score: Int): String {
    return when (score) {
        in 90..100 -> "S"
        in 80..89 -> "A"
        in 70..79 -> "B"
        in 60..69 -> "C"
        in 0..59 -> "D"
        else -> "無効な点数"
    }
}

型ごとの処理

fun printValue(value: Any) {
    when (value) {
        is Int -> println("整数: $value")
        is Double -> println("小数: $value")
        is String -> println("文字列: $value")
        else -> println("その他: $value")
    }
}

ifwhen の使い分け

if が向いている場面

  • 2分岐程度で十分なとき
  • 条件が単純なとき
  • 真偽値をそのまま判定したいとき
if (x > 0) {
    println("正の数")
} else {
    println("0以下")
}

when が向いている場面

  • 分岐が3つ以上あるとき
  • 値ごとに処理を分けたいとき
  • 範囲や型で分けたいとき
  • 条件分岐を見やすく整理したいとき
when (x) {
    1 -> println("one")
    2 -> println("two")
    3 -> println("three")
    else -> println("other")
}

まとめ

Kotlinには、Javaのような switch 文はありません。

その代わりに when を使って条件分岐を書きます。

ただし、when は単なる switch の置き換えではなく、より高機能です。

  • 値による分岐ができる
  • 複数の値をまとめられる
  • 範囲判定ができる
  • 型判定ができる
  • 条件式ベースでも書ける
  • 式として値を返せる
  • break が不要
  • 網羅性チェックがある

そのため、Kotlinでは「switchがない」ではなく、「switchより柔軟な when がある」と理解するのが最も自然です。

以上、Kotlinのswitch文についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次