三項演算子
値を 1 つ選ぶだけなのに 5 行になる
変数に入れる値を、2 つのうちどちらかに決めたい。それだけのことを if-else で書くと、宣言と代入が離れて縦に伸びます。
Java
String label;
if (age >= 20) {
label = "大人";
} else {
label = "未成年";
}同じことを 1 行で書けるのが三項演算子です。条件 ? 真のときの値 : 偽のときの値 という形をしています。
Java
String label = age >= 20 ? "大人" : "未成年";? の前で条件を聞き、? の後ろに true のときの値、: の後ろに false のときの値を書きます。並びは必ずこの順で、クエスチョンが先、コロンが後です。3 つの部分を取る演算子は Java にこれ 1 つしかないので、「三項」と呼ばれます。
文ではなく式なので、そのまま返せる
if は文です。値を持たないので return if (...) とは書けません。三項演算子は式なので、それ自体が 1 つの値になります。だから変数への代入だけでなく、return の後ろにも、メソッドの引数の中にも、そのまま置けます。
Java
System.out.println(stock > 0 ? "在庫あり" : "品切れ");if で同じことをするなら、この 1 行のためにわざわざ変数を用意して 4 行書くことになります。処理を切り替えるのではなく値を選ぶだけなら、三項演算子のほうが読み手に優しいです。
両側の型はそろえる
? の後ろと : の後ろは、同じ型にします。age >= 20 ? "大人" : 0 のように文字列と整数を混ぜると、式全体の型が決まらないためコンパイルエラーになります。
同じ理由で、値を返さない処理も枝には置けません。cond ? System.out.println("a") : System.out.println("b") は not a statement として弾かれます。三項演算子は 値を選ぶための道具 であって、if の完全な代わりではありません。
入れ子にもできますが、
?と:が 3 組並ぶと一目では読めなくなります。2 段までが目安で、それ以上はifに戻したほうが結局速く読めます。
やってみよう
absoluteValue(int n) を完成させてください。if 文は使わず、三項演算子だけで書きます。
nがどちら側にあるかを聞く条件を?の前に書く?の後ろと:の後ろに、それぞれの場合に返したい値を書く- 全体を
returnの後ろに置いて 1 行にまとめる - 実行して
-570-100の 4 件を通す
0 は正でも負でもありません。自分の書いた条件では 0 がどちらの枝に落ちるのか、そしてその枝を通っても答えが 0 になるのかを、実行する前に頭の中でたどってみてください。境界の 1 件を自分で説明できるようになると、条件式の読み方が一段変わります。
要件
- クラス名は
Solution、メソッド名はabsoluteValue、引数はint n1 つ、戻り値の型はint - 三項演算子
条件 ? 真の値 : 偽の値を使って実装すること (if文は使わない) - 負の数を渡したときは符号を反転した値 (
-n) を、0 以上ならnをそのまま返すこと
入出力例
absoluteValue(-5) → 5
absoluteValue(7) → 7
absoluteValue(0) → 0
absoluteValue(-100) → 100