Java | 複雑な条件を簡潔に書くテクニック(主に三項演算子)

Java Java
スポンサーリンク

三項演算子(?:)は if–else の短くて式として使えるバージョンです。式なので値として使え、代入や戻り値、他の式の中にそのまま書けます。けれど「短い=読みやすい」ではないので、使いどころを押さえるのが大事です。以下、初心者向けにわかりやすくまとめます。


1. 三項演算子の基本形

条件式 ? 式A : 式B
Java
  • 条件式true のとき 式A の値が選ばれる。
  • false のとき 式B の値が選ばれる。

例:

int x = 10;
String result = (x % 2 == 0) ? "偶数" : "奇数";
System.out.println(result); // 出力: 偶数
Java

2. どこで使えるか(よくあるパターン)

  • 変数への代入:
int a = (b > 0) ? b : 0;
Java
  • System.out.println や return の中に直接:
System.out.println(score >= 60 ? "合格" : "不合格");
return (n == 0) ? "ゼロ" : "非ゼロ";
Java
  • 他の式の一部として(例:文字列結合など):
String msg = "結果: " + (passed ? "成功" : "失敗");
Java

3. if–else と同じ処理(対応関係)

三項演算子:

String s = (x > 0) ? "positive" : "non-positive";
Java

if–else:

String s;
if (x > 0) {
    s = "positive";
} else {
    s = "non-positive";
}
Java

4. ネスト(入れ子)した三項演算子

複数分岐を一行で書けます(右結合なので a ? b : c ? d : e は動く)が、読みづらくなるので注意。

例(点数→評価):

String grade = (score >= 90) ? "A"
               : (score >= 70) ? "B"
               : (score >= 50) ? "C"
               : "D";
Java

可読性を上げるために改行と括弧を入れると良いです。とはいえ、この程度なら if–else if–else の方が明快なことも多いです。


5. 注意点・落とし穴(初心者がハマりやすい)

  • 式の型が一致する必要がある
    式A式B は互換な型でなければなりません(例えば intString を直接返すことはできません)。自動ボクシングでうまくいく場合もありますが、基本は同じ型を返すことを意識する。
// NG: 型が違うとコンパイルエラー(状況による)
Object o = (cond) ? 1 : "one";
Java
  • 読みやすさ
    単純な二択なら OK。条件が複数段階になったり副作用がある式では if–else にする(将来の保守性のため)。
  • 副作用のある式は避ける
    三項演算子の中でメソッド呼び出しや代入を入れると見づらくなります。副作用は if–else の方が追跡しやすい。
  • 優先順位・結合規則
    三項演算子は右結合(a ? b : c ? d : ea ? b : (c ? d : e) と等価)。ネスト時は括弧で明示すると安全。
  • 長い式はデバッグしにくい
    ブレークポイントやログを入れたいときに困ります。

6. 実用例(いろいろ)

例1:最大値を一行で

int max = (a > b) ? a : b;
Java

例2:null チェック(安全に値を取得)

String name = (user != null) ? user.getName() : "ゲスト";
Java

例3:戻り値で三項演算子

public String status(boolean ok) {
    return ok ? "OK" : "NG";
}
Java

例4:複数条件(ネスト)

String grade = (score >= 90) ? "A" :
               (score >= 70) ? "B" :
               (score >= 50) ? "C" : "D";
Java

→ 可読性を保つなら if–else if の方を推奨。


7. 実践的なルール(おすすめ)

  • 単純な2択なら三項演算子で短く書く(代入や return、ログメッセージの作成など)。
  • 三行以上の処理(条件ごとに複数ステートメントが必要)なら if–else を使う。
  • ネストは避けるか、どうしても使うなら改行+括弧で読みやすく整形する。
  • 型が明確でないときは if–else にして型ミスマッチのバグを防ぐ。
  • デバッグやログ挿入が必要そうなら if–else にする。

8. 練習問題

  1. 変数 n が負なら -1、0 なら 0、正なら 1 を返すメソッドを三項演算子だけで書け。
  2. 文字列 snull か空("")なら "空"、そうでなければ s を返す式を書け。

解答例
1.

int sign(int n) {
    return (n > 0) ? 1 : (n < 0) ? -1 : 0;
}
Java
String safe(String s) {
    return (s == null || s.isEmpty()) ? "空" : s;
}
Java

まとめ(ワンポイント)

三項演算子は「短く書ける」「式として使える」強力な道具。ただし「読めるコード」を優先することが大切。単純なら三項演算子、複雑なら if–else と覚えておけばまず間違いありません。

Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました