Java 流程控制
Java 的条件、循环与分支:if/switch、for/while、break/continue 如何组织结构化控制流。
#type / concept
#status / growing
#tech / dev
#resource / java
[!info] 关联笔记
Java 流程控制
这个概念为什么出现
业务规则是分支与循环的组合:库存够不够、状态机如何跳转、批处理如何扫单。Java 提供结构化控制流,避免回到随意 goto 风格。
[!abstract] 一句话理解 用
if/else、switch、for/while/do-while与break/continue组织分支与迭代;条件必须是 boolean(不同于 C 的整数即真)。
最小可运行示例
先把示例放进业务场景,再看代码:
场景:批处理任务按订单状态分流并跳过已取消单
扫描订单数组:取消跳过,待支付计数,已支付累加金额。
教学点:for-each、if、continue、switch。
public class OrderBatch {
enum Status { CREATED, PAID, CANCELLED }
static final class Order {
final String id;
final Status status;
final int amountCents;
Order(String id, Status status, int amountCents) {
this.id = id;
this.status = status;
this.amountCents = amountCents;
}
}
// summarize:生成批处理摘要。
//
// 业务意图:一遍扫描得到待支付数量与已支付总额。
// 教学点:continue 跳过取消单;switch 按状态分流。
static void summarize(Order[] orders) {
int pending = 0;
int paidSum = 0;
for (Order o : orders) {
if (o.status == Status.CANCELLED) {
// 取消单不进入后续统计。
continue;
}
switch (o.status) {
case CREATED -> pending++;
case PAID -> paidSum += o.amountCents;
default -> {
// CANCELLED 已 continue;保留 default 防漏新状态。
}
}
}
System.out.println("pending=" + pending + " paidSum=" + paidSum);
}
public static void main(String[] args) {
Order[] orders = {
new Order("1", Status.CREATED, 100),
new Order("2", Status.PAID, 200),
new Order("3", Status.CANCELLED, 300),
new Order("4", Status.PAID, 50)
};
summarize(orders);
}
}
建议运行:
javac OrderBatch.java && java OrderBatch
期望输出:
pending=1 paidSum=250
结合场景再看三个关注点
- 条件必须是 boolean:
if (stock)对int不成立。 switch要有默认策略,防止新增枚举值时静默漏处理。continue/break降低嵌套,但过深循环应拆方法。
核心概念与准确模型
1. if / else
- 条件表达式类型为
boolean else if链表达互斥优先级时,把高频/便宜条件放前面
2. switch
- 经典语句形态与较新的 switch 表达式 / 箭头标签随版本增强
- 对枚举与字符串切换很实用
- 注意
break贯穿(传统冒号语法)问题;箭头形态避免贯穿
3. 循环
| 形态 | 适合 |
|---|---|
for | 已知次数/索引扫描 |
| 增强 for | 遍历数组/Iterable |
while | 条件驱动 |
do-while | 至少一次 |
4. break / continue / 标签
break结束循环或 switchcontinue结束本轮- 标签 break 可跳出多层——可读性成本高,优先重构
边界情况与反直觉行为
- 增强 for 不能改结构(对集合 fail-fast 的细节见集合篇)。
- 浮点当循环条件易死循环或误差。
- 空数组 for-each 安全,零次迭代。
常见误区
[!warning] 常见误区:switch 忘记 break 传统冒号语法会贯穿到下一 case。箭头标签
->更不易踩坑。
工程实践
- 复杂分支用多态或策略表替代巨型 switch(OOP 阶段再深化)。
- 循环体内避免重复计算不变式。
- 批处理记录“处理/跳过/失败”计数,便于对账。
本节总结
- 结构化分支与循环是业务规则骨架
- boolean 条件、枚举 switch、增强 for 是日常主力
- 版本带来的 switch 表达式应查当前 JDK 文档
自测题
- 为什么
if (1)在 Java 非法? - 批处理中
continue与把条件嵌套在大if里如何取舍?
参考答案
- 条件必须是 boolean,防止 C 式整数误用。
- 早继续可降低嵌套、突出主路径;但过多 continue 也要拆方法保持清晰。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| JLS Statements | 规范 | 语句与控制流 |