Java 三元運算子

三元運算子(條件運算子)是 if-else 的簡短寫法,用於根據條件回傳不同的值。

語法

條件 ? 值1 : 值2
  • 條件為 true 時,回傳「值1」
  • 條件為 false 時,回傳「值2」

基本範例

int age = 20;

// if-else 寫法
String status;
if (age >= 18) {
    status = "成年";
} else {
    status = "未成年";
}

// 三元運算子寫法
String status2 = (age >= 18) ? "成年" : "未成年";

System.out.println(status2);  // 成年

更多範例

取得最大值

int a = 10, b = 20;

int max = (a > b) ? a : b;
System.out.println(max);  // 20

取得絕對值

int num = -5;

int abs = (num >= 0) ? num : -num;
System.out.println(abs);  // 5

判斷奇偶

int number = 7;

String result = (number % 2 == 0) ? "偶數" : "奇數";
System.out.println(result);  // 奇數

布林值轉換

boolean active = true;

String text = active ? "啟用" : "停用";
System.out.println(text);  // 啟用

巢狀三元運算子

可以巢狀使用,但可讀性會下降:

int score = 85;

// 巢狀三元運算子
String grade = (score >= 90) ? "A" :
               (score >= 80) ? "B" :
               (score >= 70) ? "C" :
               (score >= 60) ? "D" : "F";

System.out.println(grade);  // B

較複雜的情況建議使用 if-else:

// 可讀性更好
String grade;
if (score >= 90) {
    grade = "A";
} else if (score >= 80) {
    grade = "B";
} else if (score >= 70) {
    grade = "C";
} else if (score >= 60) {
    grade = "D";
} else {
    grade = "F";
}

實際應用

設定預設值

String name = null;
String displayName = (name != null) ? name : "Guest";
System.out.println(displayName);  // Guest

// Java 9+ 可以使用 Objects.requireNonNullElse
String displayName2 = Objects.requireNonNullElse(name, "Guest");

格式化輸出

int count = 5;
String message = "你有 " + count + " 則" + (count > 1 ? "訊息" : "訊息");
System.out.println(message);

限制範圍

int value = 150;
int min = 0, max = 100;

// 確保值在範圍內
int clamped = (value < min) ? min : (value > max) ? max : value;
System.out.println(clamped);  // 100

在方法中直接回傳

public boolean isAdult(int age) {
    return age >= 18 ? true : false;
}

// 更簡潔的寫法
public boolean isAdult(int age) {
    return age >= 18;
}

注意事項

型別必須相容

int a = 10;

// 編譯錯誤:型別不相容
// int result = (a > 5) ? "大" : 0;

// 正確:兩個值型別相同
String result = (a > 5) ? "大" : "小";
int result2 = (a > 5) ? 1 : 0;

括號的使用

int a = 5, b = 10;

// 建議使用括號增加可讀性
int max = (a > b) ? a : b;

// 不使用括號也可以
int max2 = a > b ? a : b;

三元運算子 vs if-else

情況建議
簡單的賦值三元運算子
複雜的邏輯if-else
巢狀超過 2 層if-else
執行多個語句if-else
// 適合三元運算子
String status = isActive ? "啟用" : "停用";

// 適合 if-else
if (isActive) {
    enableFeatures();
    logStatus();
} else {
    disableFeatures();
    notifyAdmin();
}