本記事では、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の違いと使い方について解説しました。
以上、参考になれば幸いです。



コメント