本記事では、Kotlinの分岐処理である、ifとwhenの違いと使い方について解説します。
また、Javaとの違いも合わせて解説していきます。
ifとwhenの違いと使い方
ifとwhenの違いと使い方として、以下の内容について解説していきます。
- ifとwhenの基本形
- 式として使うifとwhen
- IntRangeを使ったifとwhen
- 三項演算子風に使うif
ifとwhenの基本形
Kotlinにおけるif、else if、elseを使った基本形は以下のようになります。
fun fun1() { val a = 3 val b = 5 if (a > b) { println("a のほうが大きい") } else if (a < b) { println("b のほうが大きい") } else { println("a と b は同じ") } }
基本的な構文は、Javaと一緒です。
比較演算子もJavaにあるものは同じ意味として使うことができます。
なお、Kotlinでは「===」(インスタンスの参照が同一)と、「!==」(インスタンスの参照が異なる)が追加されています。
上記と同じ内容をwhenを使って記述すると、以下のようになります。
fun fun2() { val a = 3 val b = 5 when { a > b -> println("a のほうが大きい") a < b -> println("b のほうが大きい") else -> println("a と b は同じ") } }
whenには引数をとる記述方法と、とらない記述方法があります。
上記のプログラムは、引数をとらない記述方法です。
引数をとらない場合は、whenブロックの中に記述する各ケースを条件式にして、-> のあとに成立した場合の処理を記述します。
(-> のあとをブロック{}にして、複数の処理を記述することも可能です。)
一方、引数をとる場合の基本形は以下のようになります。
fun fun3() { val s = "A" when (s) { "A" -> println("A") "B" -> println("B") else -> println("その他") } }
引数の値によって、処理を分岐させることができ、Javaのswitch文と似た形になります。
ifとwhenの使い分け方ですが、可読性の観点から複数の処理を記述したい場合はifを使い、一つ文で処理できる場合はwhenとするのがよいと考えています。
式として使うifとwhen
Kotlinのifは「式として」使うことができます。
「式として」というのがわかりにくいと思いますので、実際のプログラムで解説します。
fun fun4() { val a = 3 val b = 5 val result = if (a > b) { println("a のほうが大きい") "$a > $b" } else if (a < b) { println("b のほうが大きい") "$a < $b" } else { println("a と b は同じ") "$a = $b" } println(result) }
先ほどのプログラムと似ていますが、ifの結果を変数resultで受け取っています。
この結果を最後にprintlnで表示しています。
このプログラムの実行結果は以下となります。
b のほうが大きい 3 < 5
式として記述すると、最後に実行された文がifの結果となります。
そのため、上記のプログラムは、以下のような動作となります。
条件分岐の部分は、else if の条件(a < b)が成立しますので、「bのほうが大きい」が表示されます。
そして、その後の「”$a < $b”」の部分が「3 < 5」に置き換わって、resultに代入されることになります。
このように、Kotlinではifの結果を変数に代入する「式として」使うことができます。
Javaにはない機能です。
なお、 式として利用する場合は最低でもelseが必須であり、基本的にその結果は全て同じ型にする必要があります。
ただし例外をスローする場合や、あるいはNothing型を返す場合は、同じ型を返す必要はありません。
whenも同様に式として使うことができます。
fun fun5() { val s:Any = "ABC" val result = when (s) { is String -> s.length else -> 0 } println(result) }
上記のプログラムでは、変数sがString型である場合は、その文字列の長さをresultに代入し、String型でない場合には0を代入しています。
このプログラムは、最初にsに文字列を代入しているので、出力結果は3となります。
IntRangeを使ったifとwhen
Javaにはないが、Kotlinにはあるクラスとして、IntRangeがあります。
IntRangeは、その名の通り整数の範囲を表すことができるクラスです。
これをifやwhenで使うと、簡潔に処理を記述することができるようになります。
例えば、Javaで数値が1~10の場合、11~20の場合、それ以外の場合で分岐をさせたい場合は以下のように記述します。
int n = 1; if (1 <= n && n <= 10) { System.out.println("nは1から10の範囲"); } else if (11 <= n && n <= 20) { System.out.println("nは11から20の範囲"); } else { System.out.println("それ以外"); }
これをIntRangeを使って記述すると以下のようになります。
fun fun6() { val n = 1 if (n in 1..10) { println("nは1から10の範囲") } else if (n in 11..20) { println("nは11から20の範囲") } else { println("それ以外") } }
条件式にinを使って、IntRangeに含まれているかどうかを確認するところがポイントです。
もちろんWhenを使っても同様に記述することができます。
fun fun7() { val n = 1 when (n) { in 1..10 -> println("nは1から10の範囲") in 11..20 -> println("nは11から20の範囲") else -> println("それ以外") } }
複雑な条件式をシンプルに記述できるのはいいですね。
なお、Whenでは複数のケースをカンマで区切ってひとまとめにすることができます。
例えば上記のプログラムは、以下のように記述しても同じ結果となります。
fun fun8() { val n = 1 when (n) { 1,2,3,4,5,6,7,8,9,10 -> println("nは1から10の範囲") 11,12,13,14,15,16,17,18,19,20 -> println("nは11から20の範囲") else -> println("それ以外") } }
上記のような使い方をすることはないと思いますが、同じ処理を行うケースをまとめると、シンプルに記述できて便利です。
また、今回はIntRangeを紹介しましたが、同様のクラスとしてCharRangeやLongRangeもあります。
三項演算子風に使うif
Javaには三項演算子があります。
例えば、以下のようなプログラムです。
int result = a < b ? "a より b の方が大きい" : "b より a の方が大きいか同一";
Kotlinには、このような三項演算子はありません。
ですが、ifを式として使うことで、似たような形を実現することができます。
val result = if (a < b) "a より b の方が大きい" else "b より a の方が大きいか同一"
三項演算子の場合は、条件分岐がtrueかfalseかの二択になりますが、Kotlinはifなので、else if を使うことができます。
つまり、二択ではなく、三択や四択にもすることができます。
val result = if (a < b) "a より b の方が大きい" else if (a > b) "b より a の方が大きいか同一" else "aとbは同一"
ただし、プログラムは読みづらくなるので注意が必要ですね。
まとめ
Kotlinのifとwhenの違いや使い方をまとめると、以下のようになります。
- ifを使った条件分岐は、whenを使っても同様の処理を行うことができる。処理部分の量によって使い分けるのがよい。
- ifやwhenは式として使うことができ、結果を変数に代入することができる。
- IntRangeやCharRangeを使うと分岐処理を完結に記述できる。
Kotlinは、Javaで書きづらかったプログラムを簡潔に記述することができるので、こうした新しい機能を積極的に取り入れていきたいですね。
今回は、ifとwhenの違いと使い方について解説しました。
以上、参考になれば幸いです。
コメント