Java 14起switch表达式替代传统switch语句,支持箭头语法、模式匹配(Java 17+)、范围匹配(Java 21+)和密封类穷尽检查,提升分支清晰度、类型安全性与可扩展性。

Java 14 起正式引入 switch 表达式(JEP 361),它不再是语句而是可返回值的表达式,配合模式匹配(Java 17+)、箭头语法、多标签合并等特性,能显著简化传统 if-else 和旧式 switch 的嵌套与重复逻辑。关键不在于“写得更短”,而在于让分支意图更清晰、类型更安全、扩展更自然。
用箭头语法替代 break + return,消除 fall-through 错误
传统 switch 容易因漏写 break 导致意外穿透;switch 表达式强制每个分支独立求值,天然避免该问题:
// ❌ 旧写法:易错、冗长
String getLevelName(int score) {
switch (score) {
case 90: case 91: case 92: case 93: case 94: case 95:
case 96: case 97: case 98: case 99: case 100:
return "A";
case 80: case 81: … case 89:
return "B";
default:
return "F";
}
}
<p>// ✅ 新写法:简洁、无穿透风险、支持范围合并(Java 21+)
String getLevelName(int score) {
return switch (score) {
case 90 -> "A";
case 80 -> "B";
case 70 -> "C";
case 60 -> "D";
default -> "F";
};
}</p>用模式匹配处理对象类型与结构,取代 instanceof + 强转
Java 17+ 支持 switch 中的类型模式(type patterns),直接解构对象并绑定变量,无需手动 instanceof 判断和显式强转:
// ❌ 旧写法:重复判断、冗余强转、易漏 null 检查
String describe(Object obj) {
if (obj instanceof String s) {
return "string: " + s.length();
} else if (obj instanceof Integer i) {
return "int: " + (i > 0 ? "positive" : "non-positive");
} else if (obj instanceof List l) {
return "list size: " + l.size();
} else {
return "unknown";
}
}
<p>// ✅ 新写法:一行匹配 + 解构 + 类型推导,null 安全(自动跳过 null)
String describe(Object obj) {
return switch (obj) {
case String s -> "string: " + s.length();
case Integer i -> "int: " + (i > 0 ? "positive" : "non-positive");
case List<?> list -> "list size: " + list.size();
case null -> "null";
default -> "unknown";
};
}</p>用密封类(sealed class)+ switch 表达式实现穷尽性检查
当分支覆盖所有可能子类型时,编译器可验证是否遗漏 case —— 这是 if-else 或旧 switch 完全做不到的:
立即学习“Java免费学习笔记(深入)”;
// 定义密封层次(Java 17+)
sealed interface Shape permits Circle, Rectangle, Triangle {}
record Circle(double r) implements Shape {}
record Rectangle(double w, double h) implements Shape {}
record Triangle(double a, double b, double c) implements Shape {}
<p>// ✅ 编译器确保所有子类都被处理;新增子类时,所有 switch 调用点立即报错
double area(Shape s) {
return switch (s) {
case Circle(double r) -> Math.PI <em> r </em> r;
case Rectangle(double w, double h) -> w <em> h;
case Triangle(double a, double b, double c) -> {
double s0 = (a + b + c) / 2;
yield Math.sqrt(s0 </em> (s0 - a) <em> (s0 - b) </em> (s0 - c));
}
};
}</p>组合多个条件时,优先用 if 表达式或提取方法,而非硬塞进 switch
switch 表达式擅长**单维度、离散、可枚举**的分发(如状态码、枚举值、固定类型)。遇到复合条件(如 score >= 90 && grade == 'A' && isFinalExam())应避免强行改造为 switch —— 这反而降低可读性。此时更优解是:
- 用 if 表达式(Java 14+ 可作为局部变量赋值)
- 将复杂判定逻辑封装为独立方法,返回一个明确的枚举或 sealed 类型,再交给 switch 处理
- 对数值区间,考虑用查找表(Map
)或二分搜索,而非罗列上百个 case


















