「Kotlinで範囲を表すRange変数の使いどころを探る」で紹介したサンプルプログラムで、if による条件判定を少し紹介しました。

今回は、その if による条件判定と when による条件判定をあわせて紹介したいと思います。
一般的な開発であれば、どちらも使う機会は多くなってきますよ。
ifによる条件判定
if を日本語に訳すと「もし」となりますよね。
その通り、if を使うと「もし新幹線を使うなら2時間」「飛行機を使うなら1時間」など場合わけができます。
早速、サンプルプログラムを書いてみます。
1 2 3 4 5 6 7 8 | // 移動手段 val way: String = "shinkansen" if (way == "shinkansen") { println("新幹線で移動すると2時間かかります") } else { println("飛行機で移動すると1時間かかります") } |
if に続く丸括弧 () の中には判定条件を書くことができるので、ここに移動手段が「shinkansen」なら新幹線の所要時間を表示してあげましょう。
文字列型の変数 way に「shinkansen」を設定していますので出力結果は以下になります。
新幹線で移動すると2時間かかります
逆に、way の変数の値を「hikouki」にすると、飛行機の所要時間が表示されます。
飛行機で移動すると1時間かかります
他の言語にも if 文はあるので、ここでは細かいことは紹介しません。
移動手段に「特急電車」を追加する場合は、else if () で条件判定を増やせばいいだけなので迷う必要はありません。
1 2 3 4 5 6 7 8 9 | val way: String = "train" if (way == "shinkansen") { println("新幹線で移動すると2時間かかります") } else if (way == "hikouki") { println("飛行機で移動すると1時間かかります") } else { println("特急電車で移動すると3時間かかります") } |
way が「shinkansen」「hikouki」以外の場合は else の条件にマッチすることになり、「特急電車」の所要時間が表示されます。
特急電車で移動すると3時間かかります
もし、厳密に場合分けしたい場合は else if () で条件を追加してください。
1 2 3 4 5 6 7 8 9 10 11 | val way: String = "other" if (way == "shinkansen") { println("新幹線で移動すると2時間かかります") } else if (way == "hikouki") { println("飛行機で移動すると1時間かかります") } else if (way == "train") { println("特急電車で移動すると3時間かかります") } else { println("その他の移動手段は使えません") } |
上記の場合は、else に入り以下の文字列が表示されます。
その他の移動手段は使えません
whenによる条件判定
Kotlin を使ったことがない人の中には、when を見てどんな処理ができるのか想像が付かない人もいると思います。
私も when は jQuery の中でしか使った記憶しかありません。
Kotlin の when はそれとは違い、Java や PHP でいうところの switch と同じような機能になります。
先ほどの移動時間のサンプルプログラムを when を使った形に書き替えてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | val way: String = "train" when (way) { "shinkansen" -> { println("新幹線で移動すると2時間かかります") } "hikouki" -> { println("飛行機で移動すると1時間かかります") } "train" -> { println("特急電車で移動すると3時間かかります") } else -> { println("その他の移動手段は使えません") } } |
switch 文を知っている方なら想像が付くと思いますが、結果は以下になります。
特急電車で移動すると3時間かかります
書き方はシェルスクリプトの case 文の方が似ているかもしれませんね。
特徴としては、各条件の処理の最後に break がないことです(シェルの場合は ;; がない)
処理が {} で括れるので範囲がわかりやすいという利点があるかなっと個人的には思っています。
では、複数の条件で同じ結果を表示させたい場合はどうしたらいいでしょうか。
例えば、「新幹線」と「特急電車」の場合は「空を飛びません」と表示させたい場合です。
それぞれの条件を書けば済む話ですが、処理が長くなる場合は無駄ですよね。
その場合は、以下のように条件がカンマ区切りで指定できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 | val way: String = "train" when (way) { "shinkansen", "train" -> { println("空を飛びません") } "hikouki" -> { println("空を飛びます") } else -> { println("その他の移動手段は使えません") } } |
今回は条件判定に文字列を使いましたが、数値ももちろん判定可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 | val num: Int= 5 when (num) { 1, 3, 5, 7, 9 -> { println("1桁の奇数です") } 0, 2, 4, 6, 8 -> { println("1桁の偶数です") } else -> { println("その他です") } } |
まとめ
if と when について紹介しました。
私の中では、数個の簡単な場合分けでは if を使い、判定条件の数が多い場合は when を使うというイメージを持っています。
好みや書きやすさ、そしてどちらで書いた方が処理が伝わりやすいかなど、状況によって使い分けができるといいですね。
Kotlin では、takeIf や takeUnless の利用により、if を使う場面が他の言語よりも少なくなるかもしれません。
ここについては、またの機会に書いてみたいと思います。