今回はKotlin制御構文の2つ目、多岐分岐のwhenです。
多岐分岐といえばswitchが思い浮かぶ方も多いかもしれませんが、switch文とは若干構文が異なります。
こちらではKotlinのwhen式の基本的な書き方、switch文との違い、記述方法のオプションについて解説していこうと思います。
when基本構文
まずは基本的な構文から見ていきましょう。
import kotlin.random.Random
fun main() {
val num = Random.nextInt(5)
when(num){
0->println("牛")
1->println("鉛筆")
2->println("小籠包")
3->println("空気清浄機")
else->println("かかと")
}
}
//牛
こちらのコードでは0~4の乱数を定数に代入し、その値が何であるかで処理を分岐させています。
when(条件式){
条件式の結果1->その場合の処理内容
条件式の結果2->その場合の処理内容
...
else->上のどれにも当てはまらない場合の処理
}
elseは「それ以外の場合」を表しますが、条件式の結果の可能性をelse無しで全て潰せるのであれば不要です。
この場合は変数numの値は0~4の間に限られるので、「4->」と書いてもかまいません。その場合elseは不要になります。
whenにbreakはいらない!
ちなみにPHP、JavaScript、Javaなどで使われているswitch文はこう書きます。こちらはJavaのswitch文です。
public class Main {
public static void main(String[] args) {
final int num = new java.util.Random().nextInt(5);
switch(num){
case 0:
System.out.println("牛");
break;
case 1:
System.out.println("鉛筆");
break;
case 2:
System.out.println("小籠包");
break;
case 3:
System.out.println("空気清浄機");
break;
default:
System.out.println("かかと");
}
}
}
//かかと
コードの意味は全く同じですが、パッと見た感じの印象は結構違うかもしれません。特にswitch文に慣れている方は、whenではbreakを記述しないという違いに注意しましょう。
whenも式である
Kotlinではifと同じようにwhenも式であり、その結果を値として持つことができます。そのため、
val num = Random.nextInt(5)
val ans = when (num) {
0 -> "牛"
1 -> "鉛筆"
2 -> "小籠包"
3 -> "空気清浄機"
else -> "かかと"
}
println("あなたの前世は${ans}です")
//あなたの前世は牛です
このようにwhenの結果を変数や定数に代入できます。
whenの()は書かなくてもよい
whenの()内には「ある値になり得る式や変数」が入りますが、ここに入れなければならないというわけではありません。
ただし()を省略する場合は、シングルアロー(->)の左辺で答えがBoolean型になる式を記述する必要があります。
val num = Random.nextInt(5)
val ans = when{
num == 0 -> "海賊王"
num % 2 == 0 -> "剣豪"
else -> "コック"
}
println("${ans}に!! 俺はなる!!")
//コックに!! 俺はなる!!
上の例ではnumが0のときと、numを2で割った余りが0(numが偶数)であるとき、それ以外(numが奇数)であるときで処理を分岐しています。
さらにこの方法を使えばwhenの条件分岐に使う値を複数設定することも可能です。
val num = Random.nextInt(5)
val name = "ルフィ" //誰が言ったのかという条件を定める
val ans = when{
name == "ルフィ" -> "海賊王" //まずnameの値で判断する
num == 0 -> "海賊王"
num % 2 == 0 -> "剣豪"
else -> "コック"
}
println("${ans}に!! 俺はなる!!")
//海賊王に!! 俺はなる!!
基本的に変数numの値でセリフは変わりますが、nameという条件を別に設定することによって、ルフィが言ったセリフである場合、numの値に関わらず「海賊王」という答えに固定されます。
whenの中にifを含める
ここからは多少応用編になりますが、whenの中に別の制御構文を含めることも可能です。例えば以下は乱数の値とnameの値2つを条件とし、セリフの内容を変化させるコードです。
val num = Random.nextInt(2)
val name = "サンジ"
val ans = when{
num == 0 -> if(name == "ルフィ"){
"海賊王"
}else if(name == "ゾロ"){
"剣豪"
}else if(name == "サンジ"){
"コック"
}else{
"盗賊"
}
else -> "怪盗ルパン"
}
println("${ans}に!! 俺はなる!!")
//コックに!! 俺はなる!!
ここでのwhenの分岐としてはnum==0かelseかの2択です。ただnumが0であった場合、処理はその中のifに持ち越され、今度はnameの値によってセリフが決定されます。
フィルターを複数設けて複雑な分岐をさせたい場合、このように記述することもできます。
おさらい
今回はKotlinの特徴的な多岐分岐whenについてお話しました。
- whenの基本構文
- 他の言語でメジャーなswitch文との違い
- whenの結果を変数や定数に代入する
- whenの条件は引数として渡すこともできるし、シングルアローの左辺に書くこともできる
- whenの中でifを使う
whenはbreakが不要なこともあって簡潔に多岐分岐が実現できるエレガントな制御構文だと思います。うまく使ってより読みやすいコードを目指してください。