【Kotlin】whenでif-else

  • 8
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

KotlinのwhenはJavaのswitch文とは異なりstringの比較を行うことが出来るうえに、whenは引数をとる必要が無いのでif-elseをwhenで書くことが出来ます。

ただ、when文のorにハマりポイントがあるのでメモ程度に紹介します。

whenでのif-else(基本構文)

Java <-> Kotlin

  • Java
int hoge = 2

if(hoge == 0) {
    System.out.println("0")
} else (hoge == 1 || hoge == 2) {
    System.out.println("1, 2")
} else {
    System.out.println("else")
}

// 1, 2
  • Kotlin(引数あり)
val hoge = 2

when (hoge) {
    0 -> {
        println("0")
    }
    1, 2 -> {
        println("1, 2")
    }
    else -> {
        println("else")
    }
}

// 1, 2
  • Kotlin(引数なし)
val hoge = 2

when {
    hoge == 0 -> {
        println("0")
    }
    hoge == 1 || hoge == 2 -> {
        println("1, 2")
    }
    else -> {
        println("else")
    }
}

// 1, 2

こんな感じでif-elseをwhenで書き換える事が出来ます。

orの書き方

上記のでwhenでは、引数無しのwhenでは, 引数ありでは||を使いましたが、ハマりポイントがあるので詳しく見ていきたいと思います。
operatorに関してはここを読んで下さい。
この記事も面白いです。
【Kotlin】 OperatorとInfixでCustom operatorを作る

  • 引数ありの場合

コンパイラのチェックではorも使用することが出来ます。
ここでは||は使えません。

val hoge = 2

when (hoge) {
    0 -> {
        println("0")
    }
    1 or 2 -> {
        println("1, 2")
    }
    else -> {
        println("else")
    }
}

// else

しかし、結果は elseになってしまう ので注意が必要です。

, or 11

※ △はコンパイラは通るが求める結果と異なる
※ markdownの都合上|| -> 11になっています

  • 引数なしの場合

この場合|| ,は使用可能ですがorは使えません。
ただ、,を使った場合はコンパイラが引数なしの場合に変換してくれます。

val hoge = 2

when {
    hoge == 0 -> {
        println("0")
    }
    hoge == 1, hoge == 2 -> {
        println("1, 2")
    }
    else -> {
        println("else")
    }
}

// 1, 2
, or 11

Booleanの場合

whenはもちろんBoolean型も判定に使用可能です。

val foo = false
val bar = true

when {
    foo -> {
        println("foo")
    }
    foo || bar -> {
        println("foo, bar")
    }
    else -> {
        println("else")
    }
}
// foo, bar
, or 11

try-kotlinで入力したら,はコンパイルエラーだったのですが、
IntelliJではコンパイル可だったので◯にしています。
上記の引数ありの場合とは異なり全てfoo, barが出力されます。

Enumの場合

もちろんEnumも使用可能です。

enum class Hoge {
    ABC,
    DEF,
    GHI,
    JKL
}
val value = Hoge.GHI

when (value) {
    Hoge.ABC -> {
        println("ABC")
    }
    Hoge.DEF, Hoge.GHI -> {
        println("DEF, GHI")
    }
    else -> {
        println("else")
    }
}

// DEF, GHI

Enumの場合は,のみ使用可能です。

, or 11

おまけ and

val foo = true
val bar = true

when {
    bar && foo -> {
        println("foo and bar")
    }
    bar -> {
        println("bar")
    }
    else -> {
        println("else")
    }
}

andはどちらも使用可能です。

and &&

まとめ

長くなりましたが、when構文はとても便利なのでKotlinでif-elseを使う際は積極的に使うことをオススメします。
現在のプロジェクトでもif-elseが出てくる箇所ではwhen文で比較しています。
ただ、引数ありの場合はorの書き方で結果が変わってしまうので注意が必要です。