スライドショー

【入門】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

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

かい

かい

日向徹かこよすぎか

[email protected]

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説