V
Vel·ToolKit
简洁 · 高效 · 即开即用
ZH
第 4 章 / 共 20 章

流程控制

if / for / while / break / switch 语句 + 表达式

if 语句

条件必须是 boolean 类型(不像 C 那样 int 能当条件)。else if 链式判断常见。

// IfDemo.java
public class IfDemo {
    public static void main(String[] args) {
        int score = 75;
        if (score >= 90) {
            System.out.println("A");
        } else if (score >= 80) {
            System.out.println("B");
        } else if (score >= 60) {
            System.out.println("C");
        } else {
            System.out.println("F");
        }
    }
}

for 循环

C 风格三段式:初始化;条件;步进。条件为 false 时退出。

// ForDemo.java
public class ForDemo {
    public static void main(String[] args) {
        // 三段式
        for (int i = 0; i < 3; i++) {
            System.out.println("i=" + i);
        }

        // 多变量
        for (int i = 0, j = 10; i < j; i++, j--) {
            System.out.println(i + " " + j);
        }
    }
}

增强 for(for-each)

用于遍历数组或任何实现 Iterable 的集合。简洁但拿不到索引——如果需要索引,改用三段式。

// ForEach.java
import java.util.List;

public class ForEach {
    public static void main(String[] args) {
        int[] nums = {1, 2, 3};
        for (int n : nums) {
            System.out.println(n);
        }

        List<String> names = List.of("Alice", "Bob", "Carol");
        for (String name : names) {
            System.out.println(name);
        }
    }
}

while 与 do-while

while 先判断再执行(可能一次都不跑);do-while 至少执行一次再判断。

// WhileDemo.java
public class WhileDemo {
    public static void main(String[] args) {
        int n = 5;
        while (n > 0) {
            System.out.println(n);
            n--;
        }

        int input;
        int tries = 0;
        do {
            input = (int) (Math.random() * 10);
            tries++;
        } while (input != 7);
        System.out.println("got 7 after " + tries + " tries");
    }
}

break / continue / 标签

break 跳出最近的循环 / switch;continue 进入下一次迭代。Java 支持标签,跳出嵌套循环最干净。

// Labels.java
public class Labels {
    public static void main(String[] args) {
        outer:
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (i * j > 6) {
                    System.out.println("stop at " + i + "," + j);
                    break outer;     // 跳出外层
                }
                if (j == 2) {
                    continue outer;  // 跳到外层的下一次迭代
                }
                System.out.println(i + "," + j);
            }
        }
    }
}

传统 switch 语句

传统 switch 按 case 标签匹配,不写 break 会"穿透"到下一个 case(这是历史包袱,常常出 bug)。switch 支持 int / String / enum 等。

// SwitchOld.java
public class SwitchOld {
    public static void main(String[] args) {
        String day = "MON";
        switch (day) {
            case "SAT":
            case "SUN":
                System.out.println("weekend");
                break;
            case "MON":
            case "TUE":
            case "WED":
            case "THU":
            case "FRI":
                System.out.println("workday");
                break;
            default:
                System.out.println("unknown");
        }
    }
}

switch 表达式(Java 14+)

现代 switch:箭头语法、不会穿透、能作为表达式赋值、多 case 合并用逗号。

// SwitchNew.java
public class SwitchNew {
    public static void main(String[] args) {
        String day = "MON";

        // 作为语句
        switch (day) {
            case "SAT", "SUN" -> System.out.println("weekend");
            case "MON", "TUE", "WED", "THU", "FRI" -> System.out.println("workday");
            default -> System.out.println("unknown");
        }

        // 作为表达式:直接 return 一个值
        int code = switch (day) {
            case "SAT", "SUN" -> 0;
            case "MON", "TUE", "WED", "THU", "FRI" -> 1;
            default -> -1;
        };
        System.out.println("code=" + code);
    }
}

switch 表达式 + yield(复杂分支)

如果某个 case 需要多行代码计算值,用 { ... yield value; }。yield 是 switch 表达式专用的"返回"关键字。

// SwitchYield.java
public class SwitchYield {
    public static void main(String[] args) {
        int month = 2;
        int year = 2024;

        int days = switch (month) {
            case 1, 3, 5, 7, 8, 10, 12 -> 31;
            case 4, 6, 9, 11 -> 30;
            case 2 -> {
                boolean leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
                yield leap ? 29 : 28;
            }
            default -> throw new IllegalArgumentException("bad month: " + month);
        };

        System.out.println(year + "-" + month + " has " + days + " days");
    }
}