Java switch表达式自JDK14预览、JDK17转正、JDK21增强,是返回值的表达式,支持箭头语法、穷举检查、作用域隔离、模式匹配及守卫条件,需处理null并显式yield。

Java 中 switch 表达式从 JDK 14 起作为预览特性引入,JDK 17 正式转正,JDK 21 进一步增强(如范围匹配、更灵活的模式匹配)。它不是语句,而是能直接返回值的表达式,天然避免 fall-through、强制穷举、作用域隔离,是替代 if-else 链和传统 switch 语句的现代选择。
用箭头语法写单值分支
最常用也最简洁的形式:每个 case 后跟 -> 和一个表达式,自动 yield 返回值,无需 break,也不穿透。
例如根据枚举状态获取描述:
String desc = switch(status) {
case PENDING -> "待处理";
case CONFIRMED -> "已确认";
case SHIPPED -> "已发货";
default -> "未知状态";
};
注意:必须覆盖所有可能取值(如 enum 类型下缺某个常量且无 default,编译报错);default 不可省略,除非类型能被编译器证明已穷尽(如密封类 + 所有子类都列出)。
合并多个值或使用块分支
多个常量可用逗号分隔,语义清晰且避免重复:
String dayType = switch(day) {
case MON, TUE, WED, THU, FRI -> "工作日";
case SAT, SUN -> "周末";
default -> "非法日期";
};
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
若需局部变量、条件判断或多行逻辑,用 { } 块,但必须显式 yield:
String greeting = switch(role) {
case ADMIN -> "欢迎,管理员";
case USER -> {
String prefix = isVIP ? "尊贵" : "普通";
yield prefix + "用户";
}
default -> "访客";
};
配合类型模式做对象解构(JDK 17+)
不再需要 instanceof + 强转。switch 可直接按运行时类型匹配并绑定变量:
String typeName = switch(obj) {
case String s -> "字符串:" + s.length();
case Integer i when i > 100 -> "大整数:" + i;
case Integer i -> "普通整数:" + i;
case null -> "空值";
default -> "其他类型";
};
支持 守卫条件(when)、null 显式匹配,且每个分支变量 s、i 作用域仅限该分支内。
注意事项与常见陷阱
- switch 表达式不接受 null 作为 scrutinee(被判断的值),运行时抛 NullPointerException,需提前判空或用
case null ->显式处理 - 箭头分支里写
{ ... }是块,不是单表达式,必须 yield;漏写 yield 会编译失败 - 逗号分隔只允许同类型常量(如 enum 常量之间、字符串字面量之间),不能混用
case 1, "a" - 目标 JDK 至少为 14(推荐 17 或 21),编译需加
--enable-preview(JDK 14/15)或直接启用(JDK 17+)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










