この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:6
ページ更新者:guest
更新日時:2026-06-11 07:12:00

タイトル: if文 (条件分岐)
SEOタイトル: Java if文 完全ガイド(if/else if/else、三項演算子、switch式、Pattern Matching)

この記事の要点
  • 基本: if (cond) {} else if (cond) {} else {}
  • 式が値を返すなら三項演算子 cond ? a : b がコンパクト
  • Java 14+ の switch 式は多分岐+値返却に強い
  • Java 17+ の Pattern Matchinginstanceof + キャストが1文に
  • ネストの深い if はEarly Returnで平坦化、null は Optional を活用

if 文の基本構文

// 1: 単純な if
if (age >= 20) {
    System.out.println("成人");
}

// 2: if-else
if (score >= 60) {
    System.out.println("合格");
} else {
    System.out.println("不合格");
}

// 3: if - else if - else
if (score >= 90) {
    grade = "A";
} else if (score >= 80) {
    grade = "B";
} else if (score >= 70) {
    grade = "C";
} else {
    grade = "F";
}

// 4: 中括弧は1文なら省略可(推奨しない)
if (age >= 20) System.out.println("成人");

中括弧は省略可能ですが、常に書くのが定石です。後から行を追加したとき、インデントが揃っているのに条件外になるバグ(Apple の goto fail 事件など)を防げます。

条件式と論理演算子

演算子意味短絡評価
&&AND(両方真)あり(左が false なら右は評価しない)
||OR(どちらか真)あり(左が true なら右は評価しない)
!NOT(反転)-
& / |論理(短絡なし)なし(両側を必ず評価)
// 短絡評価で NullPointerException 回避
if (user != null && user.isActive()) { ... }
//      ^^^^^^^^^^^^ ここが false なら右は評価されない

// 範囲チェック
if (age >= 18 && age <= 65) { ... }

// 否定の組み合わせ - de Morgan
if (!(a && b))     ⇔   if (!a || !b)
if (!(a || b))     ⇔   if (!a && !b)

三項演算子(条件演算子)

「条件で値を選ぶ」ときに簡潔に書けます:

// 通常の if-else
String label;
if (age >= 20) {
    label = "成人";
} else {
    label = "未成年";
}

// 三項演算子で1行
String label = (age >= 20) ? "成人" : "未成年";

// ネスト(読みづらいので2段までに)
String grade = score >= 90 ? "A"
             : score >= 80 ? "B"
             : score >= 70 ? "C"
             : "F";

// null 安全な取り出し
String name = (user != null) ? user.getName() : "Anonymous";

switch 式との使い分け (Java 14+)

「同じ式の値で多分岐」する場合は switch 式が読みやすく安全です:

// ❌ if-else で多分岐は冗長
String dayType;
if (day == 1 || day == 2 || day == 3 || day == 4 || day == 5) {
    dayType = "weekday";
} else if (day == 6 || day == 7) {
    dayType = "weekend";
} else {
    dayType = "unknown";
}

// ✅ switch 式(Java 14+)
String dayType = switch (day) {
    case 1, 2, 3, 4, 5 -> "weekday";
    case 6, 7          -> "weekend";
    default            -> "unknown";
};

// 文字列やenumも可
String role = switch (user.getRole()) {
    case ADMIN -> "管理者";
    case USER  -> "一般";
    case GUEST -> "ゲスト";
};
使うべき場面選択肢
1〜2分岐、シンプルな条件if / else
値を返す簡単な選択三項演算子
同じ値に対する多分岐switch 式 (Java 14+)
型による分岐Pattern Matching (Java 17+)

Pattern Matching (Java 17+)

// 旧来の書き方
if (obj instanceof String) {
    String s = (String) obj;
    System.out.println(s.length());
}

// Java 16+: パターンマッチング
if (obj instanceof String s) {
    System.out.println(s.length());      // s が String として使える
}

// switch のパターン (Java 21+)
return switch (shape) {
    case Circle c    -> Math.PI * c.radius() * c.radius();
    case Square s    -> s.side() * s.side();
    case Triangle t  -> 0.5 * t.base() * t.height();
    case null        -> 0;
    default          -> throw new IllegalArgumentException();
};

ネスト回避: Early Return

深いネストは可読性が低下します。異常系を先に returnするパターンで平坦化:

// ❌ 深いネスト
public String describe(User user) {
    if (user != null) {
        if (user.isActive()) {
            if (user.getAge() >= 18) {
                return "成人アクティブユーザー: " + user.getName();
            } else {
                return "未成年";
            }
        } else {
            return "非アクティブ";
        }
    } else {
        return "未登録";
    }
}

// ✅ Early Return で平坦化
public String describe(User user) {
    if (user == null)        return "未登録";
    if (!user.isActive())    return "非アクティブ";
    if (user.getAge() < 18)  return "未成年";
    return "成人アクティブユーザー: " + user.getName();
}

null チェックと Optional の活用

// 古典的 null チェック
String name;
if (user != null && user.getProfile() != null) {
    name = user.getProfile().getName();
} else {
    name = "Anonymous";
}

// Optional + map / orElse
String name = Optional.ofNullable(user)
    .map(User::getProfile)
    .map(Profile::getName)
    .orElse("Anonymous");

// Java 9+ ifPresent / ifPresentOrElse
Optional.ofNullable(user)
    .ifPresentOrElse(
        u -> System.out.println("Hi " + u.getName()),
        () -> System.out.println("Anonymous")
    );

// Objects.requireNonNullElse (Java 9+)
String name = Objects.requireNonNullElse(user.getName(), "Anonymous");

FAQ

Q: if文の括弧 () は省略できる?
A: Java では必須です(Python のように省略不可)。中括弧 {} は1文なら省略可能ですが、可読性のため常時付与を推奨。

Q: if と switch どちらが速い?
A: JITで最適化されるため通常は同等。switch は表ジャンプにコンパイルされる場合があり多分岐で僅かに有利。可読性で選んで OK。

Q: ==equals() はどちらを使う?
A: プリミティブと参照比較は ==、オブジェクトの内容比較は equals()。String の比較は必ず equals()== は同一インスタンス比較)。