第 3 章 · 流程控制:条件与循环
本章目标:熟练使用 if/else if/else 与三元运算符;掌握 switch(含 Java 14+ switch 表达式);熟练 for、while、do-while 循环;理解 break、continue 与带标签跳转;能编写 toolkit-demo 的订单状态判断与批量折扣逻辑;对照 python-dev ch03 理解语法差异。
学时建议:3~4 小时(含 1 小时跟练)
前置:完成 java-dev ch02;建议已学 python-dev ch03。
3.1 场景说明:订单状态与批量折扣
toolkit-demo 需要根据用户等级与购买数量决定折扣,并遍历订单列表输出状态摘要——逻辑类似 python-dev 中 shop-demo 的订单筛选脚本。
| 业务规则 | 实现方式 |
|---|---|
| 数量 ≥ 10 享 9 折 | if + 循环累加 |
| VIP 额外 95 折 | 嵌套 if 或 switch |
| 状态 PENDING/PAID/CANCEL | switch 分支 |
| 跳过已取消订单统计 | continue |
| 遇到非法状态终止 | break(示例) |
learn-java/toolkit-demo/src/main/java/demo/order/
├── OrderStatusDemo.java
└── BulkDiscount.java
3.2 布尔表达式与 if
int quantity = 12;
double total = 980.0;
boolean isVip = true;
if (quantity >= 10 && total > 500) {
System.out.println("满足大额批发条件");
} else if (quantity >= 5) {
System.out.println("小批量优惠");
} else {
System.out.println("标准价格");
}
| 对比 | Python | Java |
|---|---|---|
| 语法 | 冒号缩进 | () + {} |
| 三元 | x if c else y | c ? x : y |
| 链式 | elif | else if |
double rate = isVip ? 0.95 : 1.0;
String level = (total > 1000) ? "高" : "普通";
注意:Java 中 if (x = 5) 编译错误(赋值非布尔);Python 偶尔误写 if x = 5 也会报错(3.x)。
3.3 switch 语句与表达式
3.3.1 传统 switch(Java 8 风格)
String status = "PAID";
switch (status) {
case "PENDING":
System.out.println("待支付");
break;
case "PAID":
System.out.println("已支付");
break;
case "CANCEL":
System.out.println("已取消");
break;
default:
System.out.println("未知状态");
}
| 类型 | switch 支持(Java 17) |
|---|---|
byte short int char | ✓ |
String | ✓(Java 7+) |
enum | ✓(ch06 详讲) |
long float double | ✗ |
忘记 break 会导致贯穿(fall-through)到下一 case,常见 bug。
3.3.2 switch 表达式(Java 14+,推荐)
String label = switch (status) {
case "PENDING" -> "待支付";
case "PAID" -> "已支付";
case "CANCEL" -> "已取消";
default -> "未知";
};
int priority = switch (status) {
case "PENDING" -> 1;
case "PAID" -> { yield 2; } // 复杂块用 yield
case "CANCEL" -> 0;
default -> -1;
};
箭头语法 -> 默认不贯穿,更安全。
| Python | Java |
|---|---|
match(3.10+) | switch 表达式 |
| 无 break 贯穿问题 | 传统 switch 需注意 break |
3.4 for 循环
3.4.1 经典 for
for (int i = 0; i < 5; i++) {
System.out.println("i = " + i);
}
// 倒序
for (int i = 9; i >= 0; i--) {
System.out.print(i + " ");
}
3.4.2 for-each(增强 for)
String[] statuses = {"PENDING", "PAID", "CANCEL"};
for (String s : statuses) {
System.out.println(s);
}
| 对比 | Python | Java |
|---|---|---|
for i in range(5) | for (int i=0; i<5; i++) | |
for x in list | for (String x : list) |
Java 暂无内置 range(),可用 IntStream.range(ch09)或手写循环。
3.5 while 与 do-while
int retries = 0;
while (retries < 3) {
System.out.println("重试 " + retries);
retries++;
}
int choice = 0;
do {
choice++;
System.out.println("至少执行一次:" + choice);
} while (choice < 1);
| 循环 | 先判断后执行 | 至少一次 |
|---|---|---|
while | ✓ | 可能零次 |
do-while | 后判断 | ✓ |
3.6 break 与 continue
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数
}
if (i > 7) {
break; // 结束循环
}
System.out.println(i); // 1,3,5,7
}