switch表达式将“执行动作”转为“计算结果”,消除break穿透、减少临时变量、提升可读性;java 14+、c# 8.0、javascript均支持,以箭头语法、逗号合并、块表达式yield、直接赋值、枚举/密封类穷尽检查及模式匹配为核心特性。
用 switch 表达式替代传统 switch 语句,核心是把“执行动作”转为“计算结果”,同时消除 break 穿透风险、减少临时变量、提升可读性。java 14 起该特性已正式落地,c# 8.0、javascript 新规范也提供了类似能力,以下以 java 为主展开实战要点。
用箭头语法替换冒号+break,自动隔离分支
传统写法需反复写 case 和 break,易遗漏导致逻辑错乱;新写法用 -> 直接绑定值或表达式,匹配即终止:
- 原写法:case "PENDING": statusDesc = "待处理"; break;
- 新写法:case "PENDING" -> "待处理";
- 多个状态共用同一结果时,用逗号合并:case "APPROVED", "VERIFIED" -> "已确认";
将多行逻辑封装为块表达式,用 yield 返回结果
当某个状态需要打印日志、调用方法、拼接字符串等复合操作时,不能只写单个表达式,此时用大括号包裹,并显式 yield:
智能模型自动切换 V5.0.2 - 多模态感知,自动识别图片/视频/音频/代码/文本任务,切换最优模型。支持图片理解(qwen3-vl-plus)、视频音频(qwen3.5-plus)、代码(glm-5)、Office文档(MiniMax-M2.5)、推理等场景。零感知切换,无需手动操作。
- case "REJECTED" -> {
log.warn("订单被拒:{}", orderId);
notifyAdmin(orderId);
yield "已拒绝(已告警)";
} - 注意:块内变量作用域受限,不会污染其他分支
直接赋值给变量,省去中间状态变量
传统 switch 常需先声明变量再在各 case 中赋值;表达式天然支持返回值,一步到位:
- 原写法:String level = null;
switch (score) { case 90: level = "A"; break; ... } - 新写法:String level = switch (score) {
case 90, 95, 100 -> "A";
case 80, 85 -> "B";
default -> "C";
};
配合枚举与密封类,让状态分发更类型安全
若状态本身是枚举(如 OrderStatus.PENDING),或使用 sealed class 描述有限状态集,switch 表达式能触发编译期穷尽检查:
- 编译器会提示是否遗漏了某个枚举常量,避免运行时 default 分支兜底掩盖问题
- 结合 record 或模式匹配(如 Java 21 的模式匹配 switch),还能解构对象属性做条件判断










