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 は便利なので積極的に利用できるようになっておきたいです