JDK 17 正式支持 switch 表达式(JEP 361),以箭头语法(->)替代冒号,自动终止分支、禁止 fall-through,支持直接返回值、多语句分支(用 yield)、类型推断及枚举穷举检查。

JDK 17 正式支持 switch 表达式(JEP 361),它比传统 switch 语句更简洁、安全、函数式,核心是用 箭头语法(->)替代冒号(:),并支持直接返回值,无需 break 和 fall-through。
用箭头(->)代替冒号,自动终止分支
传统写法需显式 break 防止穿透;switch 表达式中每个分支用 -> 声明,天然无穿透,代码更清晰:
// JDK 17+ 推荐写法(表达式)
String result = switch (day) {
case MON, TUE, WED -> "Workday";
case THU -> "Almost weekend";
case FRI -> "Yes!";
case SAT, SUN -> "Weekend";
default -> "Unknown day";
};
注意:这里整个 switch 是一个表达式,可直接赋值给变量,且每个分支只执行右侧表达式,不进入下一个 case。
支持多语句分支:用花括号 + yield 返回值
当某个分支需要多行逻辑时,用 { } 包裹,并用 yield 显式返回结果(不能用 return):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
int code = switch (status) {
case ACTIVE -> 200;
case PENDING -> {
log.info("Pending status handled");
yield 202; // 必须用 yield
}
case ERROR -> {
notifyAdmin();
yield 500;
}
default -> throw new IllegalArgumentException("Invalid status: " + status);
};
类型推断更智能,支持任意引用类型和基本类型
JDK 17 的 switch 表达式支持 String、enum、int、byte、short、char 及其包装类(JDK 14 起已支持,JDK 17 稳定可用)。从 JDK 21 开始还支持 pattern matching(如 record 解构),但 JDK 17 尚未包含。
- 枚举:推荐用 enum 字面量,编译期检查更严格
- 字符串:直接写
case "abc" ->,无需额外 null 检查(null 会抛NullPointerException,可配合 default 处理) - 整数:支持
case 1, 2, 3 ->多值合并
必须覆盖所有可能取值(或提供 default)
如果 switch 表达式的类型是 enum,且没有 default 分支,编译器会检查是否穷举了所有枚举常量。若遗漏,编译失败 —— 这提升了安全性:
enum Color { RED, GREEN, BLUE }
Color c = ...;
String name = switch (c) {
case RED -> "Red";
case GREEN -> "Green";
// 编译错误:missing case for 'BLUE' —— 必须补上或加 default
};

















