LoginSignup
84
50

More than 5 years have passed since last update.

【Kotlin】whenでif-else

Last updated at Posted at 2016-02-04

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の書き方で結果が変わってしまうので注意が必要です。

84
50
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
84
50