KotlinのwhenはJavaのswitch文とは異なりstringの比較を行うことが出来るうえに、whenは引数をとる必要が無いのでif-elseをwhenで書くことが出来ます。
ただ、when文のorにハマりポイントがあるのでメモ程度に紹介します。
whenでのif-else(基本構文)
Java <-> Kotlin
- Java
int hoge = 2
if(hoge == 0) {
System.out.println("0")
} else (hoge == 1 || hoge == 2) {
System.out.println("1, 2")
} else {
System.out.println("else")
}
// 1, 2
- Kotlin(引数あり)
val hoge = 2
when (hoge) {
0 -> {
println("0")
}
1, 2 -> {
println("1, 2")
}
else -> {
println("else")
}
}
// 1, 2
- Kotlin(引数なし)
val hoge = 2
when {
hoge == 0 -> {
println("0")
}
hoge == 1 || hoge == 2 -> {
println("1, 2")
}
else -> {
println("else")
}
}
// 1, 2
こんな感じでif-elseをwhenで書き換える事が出来ます。
orの書き方
上記のでwhenでは、引数無しのwhenでは,
引数ありでは||
を使いましたが、ハマりポイントがあるので詳しく見ていきたいと思います。
operatorに関してはここを読んで下さい。
この記事も面白いです。
【Kotlin】 OperatorとInfixでCustom operatorを作る
- 引数ありの場合
コンパイラのチェックではor
も使用することが出来ます。
ここでは||
は使えません。
val hoge = 2
when (hoge) {
0 -> {
println("0")
}
1 or 2 -> {
println("1, 2")
}
else -> {
println("else")
}
}
// else
しかし、結果は elseになってしまう ので注意が必要です。
, | or | 11 |
---|---|---|
◯ | △ | ☓ |
※ △はコンパイラは通るが求める結果と異なる
※ markdownの都合上||
-> 11
になっています
- 引数なしの場合
この場合||
,
は使用可能ですがor
は使えません。
ただ、,
を使った場合はコンパイラが引数なしの場合に変換してくれます。
val hoge = 2
when {
hoge == 0 -> {
println("0")
}
hoge == 1, hoge == 2 -> {
println("1, 2")
}
else -> {
println("else")
}
}
// 1, 2
, | or | 11 |
---|---|---|
◯ | ☓ | ◯ |
Booleanの場合
whenはもちろんBoolean型も判定に使用可能です。
val foo = false
val bar = true
when {
foo -> {
println("foo")
}
foo || bar -> {
println("foo, bar")
}
else -> {
println("else")
}
}
// foo, bar
, | or | 11 |
---|---|---|
◯ | ◯ | ◯ |
try-kotlinで入力したら,
はコンパイルエラーだったのですが、
IntelliJではコンパイル可だったので◯にしています。
上記の引数ありの場合とは異なり全てfoo, barが出力されます。
Enumの場合
もちろんEnumも使用可能です。
enum class Hoge {
ABC,
DEF,
GHI,
JKL
}
val value = Hoge.GHI
when (value) {
Hoge.ABC -> {
println("ABC")
}
Hoge.DEF, Hoge.GHI -> {
println("DEF, GHI")
}
else -> {
println("else")
}
}
// DEF, GHI
Enumの場合は,
のみ使用可能です。
, | or | 11 |
---|---|---|
◯ | ☓ | ☓ |
おまけ and
val foo = true
val bar = true
when {
bar && foo -> {
println("foo and bar")
}
bar -> {
println("bar")
}
else -> {
println("else")
}
}
andはどちらも使用可能です。
and | && |
---|---|
◯ | ◯ |
まとめ
長くなりましたが、when構文はとても便利なのでKotlinでif-elseを使う際は積極的に使うことをオススメします。
現在のプロジェクトでもif-elseが出てくる箇所ではwhen文で比較しています。
ただ、引数ありの場合はorの書き方で結果が変わってしまうので注意が必要です。