Java 14引入switch表达式,Java 17正式定型,支持箭头语法、多值匹配、模式匹配、大括号+yield复杂逻辑及编译期全覆盖检查,提升安全性与简洁性。

Java 14 开始引入 switch 表达式(JEP 361),到 Java 17 成为正式特性,它让 switch 不再只是语句,还能直接返回值,大幅减少冗余代码、避免 break 遗漏、消除作用域污染,写法更简洁安全。
用箭头语法替代冒号 + break
传统 switch 语句需显式写 break,易出错;新表达式用 -> 替代 :,自动终止分支,不穿透:
// 旧写法(易漏 break,变量作用域外溢)
String dayType;
switch (day) {
case "Mon", "Tue", "Wed", "Thu", "Fri":
dayType = "Weekday";
break;
case "Sat", "Sun":
dayType = "Weekend";
break;
default:
dayType = "Unknown";
}
// 新写法(一行一值,无 break,类型推导清晰)
String dayType = switch (day) {
case "Mon", "Tue", "Wed", "Thu", "Fri" -> "Weekday";
case "Sat", "Sun" -> "Weekend";
default -> "Unknown";
};
支持多值匹配和模式化 case
一个 case 可用逗号分隔多个常量(无需重复写 case),也兼容枚举、字符串、基本类型;Java 21 起还支持 模式匹配 case(如 case Integer i ->),进一步简化类型判断逻辑:
智能模型自动切换 V5.0.2 - 多模态感知,自动识别图片/视频/音频/代码/文本任务,切换最优模型。支持图片理解(qwen3-vl-plus)、视频音频(qwen3.5-plus)、代码(glm-5)、Office文档(MiniMax-M2.5)、推理等场景。零感知切换,无需手动操作。
- 多个字面量合并:
case 1, 2, 3 -> "small" - 枚举直接用:
case STATUS.ACTIVE, STATUS.PENDING -> "alive" - Java 21 示例:
case String s when s.length() > 10 -> "long"
可直接返回复杂逻辑(用大括号 + yield)
当某个分支需要多行计算或局部变量时,用 { ... yield value; } 包裹,保持表达式整体性,避免退化为语句块:
立即学习“Java免费学习笔记(深入)”;
int result = switch (input) {
case null -> -1;
case String s -> {
int len = s.trim().length();
yield len > 0 ? len : -1;
}
case Integer i -> Math.abs(i);
default -> 0;
};
必须覆盖所有可能路径(编译期检查)
switch 表达式要求:对 enum 类型,所有枚举常量必须出现在 case 中,或有 default;对 String 或 int 等,则必须有 default。编译器强制兜底,避免运行时遗漏:
- 没写
default且类型是 enum → 编译错误 - 输入是
String却没default→ 编译错误 - 这样比老 switch 更健壮,不用靠人工检查是否漏分支

















