【Kotlin入門】ifとwhenの違いと使い方

プログラミング

本記事では、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の違いと使い方について解説しました。

以上、参考になれば幸いです。

コメント

タイトルとURLをコピーしました