覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Kotlin - when式

Java で switch文を使って処理を分岐するケースは、 when 式で記述します。

例えば、数値型の値を条件にとって

  • 値が 1 なら ''Value is One" と出力する
  • 値が 2 なら ''Value is Two" と出力する
  • 値が 3から10 なら ''Value range in 3 .. 10 (value = xx)" と出力する (xxの部分は条件として与えた値)
  • 上記のいずれの条件にも当てはまらない場合は、 "Unknown value (value = xx)" と出力する (xxの部分は条件として与えた値)

これを実現する関数を when を利用して書くと以下のようになります

fun valuePrint(value: Int) {
    when(value) {
        1 -> println("Value is One")
        2 -> println("Value is Two")
        in 3..10 -> println("Value range in 3 .. 10 (value = $value)")  // 値範囲の一致チェックもできる
        else -> println("Unknown value (value = $value)")
    }
}


上記の関数を以下で実行したとすると、

fun main() {
    valuePrint(1)
    valuePrint(2)
    valuePrint(5)
    valuePrint(10)
    valuePrint(0)
}

結果は以下のようになります

Value is One
Value is Two
Value range in 3 .. 10 (value = 5)
Value range in 3 .. 10 (value = 10)
Unknown value (value = 0)


Java の switch文との大まかな違いは以下の通りです。

  • switch が whenになった
  • case: が ->になった
  • 各条件の処理の終わりにbreakを記述しなくて良い
  • default が elseになっている


when は式なので、その分岐結果から値を返す事が可能です。

例えば、先ほどの関数を変形して以下のような関数を定義することができます。(whenで分岐した結果を文字列とreturnする関数)

fun valueToString(value: Int) =
    when(value) {
        1 -> "One"
        2 -> "Two"
        in 3..10 -> "Value range in 3 .. 10 (value = $value)"
        else -> "Unknown value (value = $value)"
    }


上記の関数を以下で実行したとすると、

fun main() {
    val a1 = valueToString(1)
    val a2 = valueToString(10)
    val a3 = valueToString(-1)
}

実行結果は以下のようになります

a1 -> One
a2 -> Value range in 3 .. 10 (value = 10)
a3 -> Unknown value (value = -1)


引数なしでwhen

when は、引数なしで利用することも可能です。こうした場合は if-else ifを代替することができます。 分岐条件は単純なBooleanの式となります。

fun InsteadOfIf(value: Int) {
    when {
        value > 0 -> println("Value is Positive number")
        value < 0 -> println("Value is Negative number")
        value == 0 -> println("Value is Zero")
        else -> println("Unknown value (value = $value)")
    }
}


上記の関数を以下で実行したとすると、

fun main() {
    InsteadOfIf(1)
    InsteadOfIf(10)
    InsteadOfIf(-1)
    InsteadOfIf(0)
}

実行結果は以下のようになります

Value is Positive number
Value is Positive number
Value is Negative number
Value is Zero


型のチェックと組みあわせ

Kotlin では is を使うことで、ある変数が目的の型かどうかをチェックすることも可能です。
ある変数が目的の型かどうかをチェックすれば、チェック済みの型を持つ変数として使用できます。

when(value) {
        is Int -> println("$value + 100 = ${value + 100}")    // ->  対象が Int 型なら 100加算する演算を行う
        is String -> println("$value UpperCase -> ${value.toUpperCase()}")    // -> 対象が String 型 なら 大文字化する
        else -> println("Unknown Type")
    }


まとめ

Kotlin の when は便利なので積極的に利用できるようになっておきたいです