【入門】Kotlinでwhenを使いこなそう!Javaとの違いについても解説

Kotlinでwhenの使い方を学びたい
JavaからKotlinに入ったけど構文の違いを比較しながら確認したい

Kotlinをこれから学ぼうとしている方の中には上記のような悩みを抱えている人も多いのではないでしょうか?

こんにちは!現役エンジニアのかいです。今日は、Kotlin初心者のためにwhenの使い方を徹底的に解説していこうと思います。

Kotlinを学ぶ方の中には、以前までJavaを書いていた人も多いのでJavaとの比較も紹介していきます。whenは使いこなせるようになると、とても便利ですのでこれを機にぜひマスターしていってください!

この記事はこんな人のために書きました

  • Kotlinでwhenを使ってみたい
  • Javaとどのような違いがあるのか知りたい
  • 様々な違いをみてみたい

Kotlinのwhenとは

まずKotlinのwhenとはどのようなものかを説明しておきます。whenはJavaや他言語で言う所のswitch文のようなものです。

ただ、従来までのswitch文と比べてStringの比較ができたり引数を取らないなんてこともできるのでswitch文の上位互換といったところでしょうか。詳しい内容は後述しますが、少なくともJavaのswitch文と比べると上位互換ということができとても書きやすくなっています。

後述の内容でどのようなものかわかるので特に必要はないですが、Javaのswitch文について詳しく知っておきたい方は以下の記事を参考にしてみてください。

whenを引数ありで使ってみよう

説明ばかりしていても仕方ないので実際に使い方をみていきましょう!最初は引数をとった場合をみていきます。

Kotlinでのコードを見てみよう

fun fruit(value: String) {
    when(value) {
        "りんご" -> println("Apple!")
        "ばなな" -> println("Banana!")
        else -> println("Unknown($value)")
    }
}
fun main(args: Array<String>) {
    fruit("ばなな")
    fruit("ぶどう")
    fruit("りんご")
}
Banana!
Unknown(ぶどう)
Apple!

こちらがKotlinのwhen文です。switchがwhenに代わり、caseが->に代わったといったところでしょうか。引数を与えず中で判定させることも可能です。

fun fruit(value: String) {
    when {
        value == "りんご" -> println("Apple!")
        value == "ばなな" -> println("Banana!")
        else -> println("Unknown($value)")
    }
}
fun main(args: Array<String>) {
    fruit("ばなな")
    fruit("ぶどう")
    fruit("りんご")
}

また、以下のようにブロックとして記述することも可能です

fun fruit(value: String) {
    when(value) {
        "りんご" -> {
            println("Apple!")
        }
        "ばなな" -> {
            println("Banana!")
        }
        else -> {
            println("Unknown($value)")
        }
    }
}
fun main(args: Array<String>) {
    fruit("ばなな")
    fruit("ぶどう")
    fruit("りんご")
}

さらに、Kotlinのwhenは式です。なので値を返すことができます。

fun fruit(value: String): String {
    return when(value) {
        "りんご" -> "Apple!"
        "ばなな" -> "Banana!"
        else -> "Unknown($value)"
    }
}
fun main(args: Array<String>) {
    val fruit1 = fruit("ばなな")
    val fruit2 = fruit("ぶどう")
    val fruit3 = fruit("りんご")

    println(fruit1)
    println(fruit2)
    println(fruit3)

}
Banana!
Unknown(ぶどう)
Apple!

Javaでのコードをみてみよう

では上記のwhen式をJavaで書くとどうなるのかみてみましょう。

public class test {
    public static void fruit(String value) {
        switch (value) {
            case "りんご":
                System.out.println("Apple!");
                break;
            case "ばなな":
                System.out.println("Banana");
                break;
            default:
                System.out.println(String.format("Unknown(%s)", value));
        }
    }

    public static void main(String[] args) {
        fruit("ばなな");
        fruit("ぶどう");
        fruit("りんご");
    }

}
Banana
Unknown(ぶどう)
Apple!

こんな感じでしょうか。大変ですね正直。そういえばKotlinではbreakなども書く必要はありません。

inで範囲を調べてみよう

もう少し使いこなすためにどんどん使っていきましょう。試しにここではinを使ってRangeで条件分岐してみましょう。

import com.sun.org.apache.xpath.internal.operations.Bool

fun score(value: Int) {
    when(value) {
        in 0..59 -> println("赤点!")
        in 60..79 -> println("まあまあ!")
        in 80..100 -> println("よく頑張った!")
        else -> println("許されない")
    }
}
fun main(args: Array<String>) {
    score(59)
    score(60)
    score(90)
    score(-1)
    score(1000)
}
赤点!
まあまあ!
よく頑張った!
許されない
許されない

こんな感じになりますね。まあ実際はこの書き方だと浮動小数点型などであれば値が漏れやすい(79.5点など)ので気をつけてくださいね。

isで型判定を行ってみよう

次はisで型判定を行ってみます。どんどん使っていきます!

fun fruit(value: Any) {
    when(value){
        is String -> println("($value) is String!")
        is Boolean -> println("($value) is Boolean!")
        is Int -> println("($value) is Int!")
        else -> println("else!")
    }
}
fun main(args: Array<String>) {
    fruit("ばなな")
    fruit(3)
    fruit(true)
}
(ばなな) is String!
(3) is Int!
(true) is Boolean!

うーん、使いやすくてわかりやすいですね!

whenを引数なしで使ってみよう

それでは次はwhenを引数なしで使ってみましょう。ちなみに引数なしで使うとif文のように分岐させることができます。

fun fruit(values: ArrayList<String>) {
    when {
        "ばなな" in values -> println("banana")
        "りんご" in values -> println("apple")
        else -> println("nothing")
    }
}
fun main(args: Array<String>) {
    var values = arrayListOf("ばなな", "ぶどう", "りんご")
    fruit(values)
}
banana

このように、ばななが評価された後は評価されていないことがわかりますね。このようにif-elseの代用として利用することも可能です。

まとめ

まとめると、when最高という感じですね。読みやすいし書きやすいのでかなり便利です。

KotlinはAndroidのみならずこれからサーバーサイドでもどんどん活躍していく(筆者の予想ですが)のでJavaには隠居していただいて、確実にマスターしておきたいところですね。中でもwhenは基本中の基本ですのでみなさん自由に書いてみて使い方に慣れていってください!

それでは!!

LINEで送る
Pocket

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

かい

かい

日向徹かこよすぎか

[email protected]