Javaの3項演算子とは?
この記事では、Javaの3項演算子について解説します。
3項演算子とは、3つの変数に対して使うもので、if文をはじめとした条件分岐を省略するために使う演算子のことです。
3項演算子の使い方
ではさっそく、3項演算子の使い方を見ていきましょう。
使うときは、次のように記述します。
条件式 ? 式1 : 式2;
「条件式」の部分に任意の条件を記述します。
そして「?」の後ろの「式1」に、trueの場合の式を、「式2」に、falseの場合の式を書く形です。
3項演算子は改行して記述も可能
3項演算子は、可読性を上げるために改行して記述してもOKです。
その場合は、次のように記述できます。
条件式 ? 式1 : 式2;
if文と3項演算子を比較
ここでは、3項演算子とif文の内容を比較しながら使ってみます。
記述例は次の通りです。
■記述例 public class Main { public static void main(String args[]){ int i01 = 126, i02 = 100; String result; System.out.println("3項演算子の結果"); result = (i01 > i02) ? "i01はi02よりも大きいです" : "i01はi02よりも小さいです"; System.out.println(result); System.out.println("if文の結果"); if(i01 > i02) { result = "i01はi02よりも大きいです"; } else { result = "i01はi02よりも小さいです"; } System.out.println(result); } }
上記のプログラムは、int型の変数「i01」「i02」を比較し、結果によって表示する文字列を制御しています。
内容はまったく同じですが、3項演算子の方が記述量(行)が少なく、スッキリまとまっています。
実行結果は次の通りです。
■実行結果 mbp:Desktop potepan$ java Main 3項演算子の結果 i01はi02よりも大きいです if文の結果 i01はi02よりも大きいです
どちらも、同じ表示結果になっているのがわかります。
また、先述した改行して書く方法は次の通りです。
■記述例 public class Main { public static void main(String args[]){ int i01 = 126, i02 = 100; String result; result = (i01 > i02) ? "i01はi02よりも大きいです" : "i01はi02よりも小さいです"; System.out.println(result); } }
実行結果は、上記と同じになります。
3項演算子を複数の条件でネストして使う
3項演算子は、ネスト(入れ子)にして使うことも可能です。
ここでは、3項演算子で条件式を複数設定する方法を見ていきましょう。
記述方法は次の通りです。
条件式1 ? 条件式2 ? "出力結果1" : "出力結果2" : "出力結果3";
基本構文に、条件式と出力させる式を追加します。
少し複雑に感じるかもしれませんか、それぞれの条件式の結果による出力結果は、次の通りになります。
条件式1 | 条件式2 | 出力結果 |
---|---|---|
true | true | 出力結果1 |
true | false | 出力結果2 |
false | true | 出力結果3 |
false | false | 出力結果3 |
では、実際にプログラムを動かして確認してみます。
■記述例 public class Main { public static void main(String args[]){ int i01 = 126, i02 = 100, i03 = 200; String result; System.out.println("両方ともtrueの場合"); result = (i01 > i02) ? (i02 < i03) ? "出力結果1" : "出力結果2" : "出力結果3"; System.out.println(result); System.out.println("条件1がtrue、条件2がfalseの場合"); result = (i01 > i02) ? (i02 > i03) ? "出力結果1" : "出力結果2" : "出力結果3"; System.out.println(result); System.out.println("条件1がfalse、条件2がtrueの場合"); result = (i01 < i02) ? (i02 < i03) ? "出力結果1" : "出力結果2" : "出力結果3"; System.out.println(result); System.out.println("両方ともfalseの場合"); result = (i01 < i02) ? (i02 > i03) ? "出力結果1" : "出力結果2" : "出力結果3"; System.out.println(result); } }
■実行結果 mbp:Desktop potepan$ java Main 両方ともtrueの場合 出力結果1 条件1がtrue、条件2がfalseの場合 出力結果2 条件1がfalse、条件2がtrueの場合 出力結果3 両方ともfalseの場合 出力結果3
出力結果は、どれも意図した通りになっているのがわかりますね。
3項演算子で何もしない・falseを省略する処理は入れられる?
例えば、falseの場合は何もしないといった動きはできるでしょうか?
結論を言うと、何かしらの値は入れる必要があります。代わりの方法として「空白」にするか「null」を返すことができるでしょう。
出力結果がString型の場合、返す値を空白にすることで、何もしない処理を実現可能です。
具体的には、次のように記述できます。
■記述例 public class Main { public static void main(String args[]){ int i01 = 126, i02 = 100; String result; result = (i01 < i02) ? "出力します" : ""; System.out.println(result); } }
実行結果は、空白で返ります。
また、String型でない場合などは「null」を返すことでも似たような処理になるでしょう。
nullは、変数の値に何も定義されていない(何も入っていない)状態を表す特殊な値です。
記述例は次のようになります。
■記述例 public class Main { public static void main(String args[]){ int i01 = 126, i02 = 100; String result; result = (i01 < i02) ? "出力します" : null; System.out.println(result); } }
こちらは実行結果で「null」が返ります。
nullについて理解を深めたい場合は、以下の記事をチェックしてみてください。
【関連記事】
▶︎Javaでnullを正しく扱おう!新しいOptionalクラスも活用
まとめ
Javaの3項演算子について解説しました。
3項演算子は、記述量が減るというメリットがある一方で、処理がわかりにくくなり可読性が下がると感じる場合もあります。
特に、ネストして使う場合は、結果がどのように分岐するかわかりづらくなるでしょう。
そのため、3項演算子は使い所を見極め、必要に応じてif文を使うなど配慮が必要でしょう。
もし、3項演算子を使う場合は、ぜひこの記事を参考にしてくださいね。
ちなみに、3項演算子以外にも「単項演算子」「2項演算子」があります。
単項演算子は、変数1つに対して使うものです。
例えば、数値型の変数を1つ増やす「++演算子」や、変数や条件式を true から false に、false から true に「!演算子」といったものがあります。
一方、2項演算子は、2つの変数に対して使うものです。
数値の計算でよく使う「+演算子」や「-演算子」などが当てはまります。