Javaの三項演算子

Javaでは以下の形で条件式がtruefalseかで真式か偽式を評価する式。

条件式 ? 真式 : 偽式

例えば、abのうち小さい方として評価される式は以下のように記述できる。

int x = (a < b) ? a : b;

Kotlinには上記3項演算子は存在しない。
KotlinはJavaに似てるからと同じノリで上記を書こうとしてもコンパイルエラーになる。

Kotlinでは三項演算子の代わりにif式を使う

Kotlinのifは式なので、3項演算子の代わりとなる。

if (条件式) 真式 else 偽式

abのうち小さい方として評価される式は以下のように記述できる。

val x = if (a < b) a else b

条件内の変数がnullだったら(nullならデフォルト値としたいなら)エルビス演算子を使う

よくある特別なパターンとしてnullならデフォルト値を入れるというパターンがある。

String x = (a != null) ? a : "";

上記のJavaプログラムKotlinのif式で記述すると以下のようになる。

val x = if (a != null) a else "";

Kotlinのエルビス演算子を使えばもっとスマートに書ける。

val x = a ?: ""

エルビス演算子「?:」を使った式「a ?: ""」は以下の様に評価される。

  • 左辺(a)がnullなら右辺("")
  • 左辺(a)がnullでないなら左辺("")

上記の様に評価されるため、nullチェックしてデフォルト値を入れるパターンがスマートに実現できる。

エルビス演算子については以下の記事も参照。
【Android,Kotlin】Null許容型(?)をunwrapするパターン

エルビス演算子を複数重ねる

以下のように2つの変数をnullチェックし、両方nullならデフォルト値とするパターンを考える。

  • 変数aがnullでなければa
  • 変数aがnullで、変数bがnullでなければb
  • 変数a, bがnullなら空文字列

上記パターンをif式で記述すると以下のようになる。

val x = if (a != null) a else (if (b != null) b else "")

if式の場合、1段ネストしただけでもかなり読みづらくなる。

一方、上記パターンをエルビス演算子で記述すると以下のようになる。

val x = a ?: b ?: ""

可読性はそれほど落ちていない。

変数が増えても同様にいくつでも重ねられる。

val x = foo
      ?: bar
      ?: baz
      ?: hoge
      ?: fuga
      ?: ""