Kotlin Advent Calendar 2012 (全部俺)

JavaプログラマのためのKotlin入門

6日目:人生は選択の連続

f:id:ngsw_taro:20121205002931j:plain

アドベントカレンダー6日目の今日は、条件分岐式についてお話ししたいと思います。条件分岐文でないことに注意してください。式なのです。何か値を返す、これも関数型プログラミング的アプローチのひとつです。

if式

まず1つ目に紹介するのは馴染みの深いキーワード ifelse による条件分岐式です。前述の通り、Kotlinの if と else は値を返します。そのためそれらはちょうどJavaの ? と : に似ています*1

val str = if(n % 2 == 0) {
    "even"
} else {
    "odd"
}

上記の例の場合、if と else ブロック内の式がたった1つなので波括弧を省略できます。else がなく if のみの場合や、1つでもUnitを返す分岐が存在する場合、その if式全体の結果がUnitとなります。

when式

Kotlinにはwhen式というJavaのswitch文と似た機能がありますが、それよりも強力な仕組みです。

val str = when(number) {
  1 -> "1st"
  2 -> "2nd"
  3 -> "3rd"
  4, 5, 6, 7, 8, 9 -> "${number}th"
  in 10..20 -> "10th+"
  else -> "unknown"
}

when式はswitch文のように、引数の値が分岐条件に合致するまで上から順に比較していきます。分岐条件が満たされると -> の右側の式を返します。switch文のような break はありません。もし次の分岐に飛びたい場合は continue を記述します*2

上記の例において、number が 1 の時、when式は "1st" を返します。number が 4から9までのいずれかである場合は、その数の後に "th" がくっついた文字列が返されます。

in 10..20のような書き方もできます。この意味は「 number が10以上20以下である場合」です。..レンジというオブジェクトの生成演算子です。詳細は後日紹介します。

どの分岐条件にも当てはまらなかった場合には else の先の式が返されます。when式には else が必須であることに注意してください。

when式は次のように記述することでif else ifの長ったらしい分岐を簡潔に表現することができます。

when {
  fizz(a) && buzz(a) -> "fizzbuzz"
  fizz(a) -> "fizz"
  buzz(a) -> "buzz"
  else -> "$a"
}

ここでの関数 fizz と buzz の返り値の型は Boolean です。例えば fizz(a) のみが true を返す場合、このwhen式は "fizz" を返します。

when式は次のような簡単なパターンマッチングをサポートしています。

when(obj) {
  is Int -> "整数値"
  is Double -> "浮動小数値"
  else -> "その他"
}

この例は、obj の型をチェックして、対応する文字列を返すwhen式となっています。将来的には、より複雑なパターンマッチができるようになるらしいです。

まとめと次回予告

今日は条件分岐ということで、if式とwhen式を学びました。「式」なので、両者は値を返します。when式はJavaのswitch文と似ていますが、レンジとの比較や簡単なパターンマッチングなどにも対応しており強力です。

明日はループについてお話しします。

 

*1:三項演算子や条件演算子と呼ばれています。

*2:現時点において、when式での continue は実装されていません。