【入門】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は基本中の基本ですのでみなさん自由に書いてみて使い方に慣れていってください!

それでは!!

この記事を書いた人

日向徹かこよすぎか

kaikaikai8217@gmail.com

目次