从JDK 14起switch可作为表达式使用,支持箭头语法、多值case、模式匹配(JDK 17+),要求穷尽所有分支或含default,自动终止无需break,返回值类型统一且可直接赋值或嵌入lambda。

从 JDK 14 开始,switch 可以作为表达式使用(JEP 361),并在 JDK 15 正式成为标准特性;它不再只是语句,还能直接返回值,语法更简洁、类型更安全。
用箭头语法(->)替代冒号(:)
传统 switch 使用 break 防止穿透,容易出错;新写法用 -> 表示“匹配即返回”,自动终止,无需 break:
-
case A -> 表达式;:右侧必须是单个表达式(如字面量、方法调用、new 对象等) - 多个语句需用大括号包裹,并用
yield显式返回值 - 所有分支必须返回相同类型,编译器会推断并检查类型一致性
支持多值 case 和模式匹配(JDK 17+)
可在一个 case 中列出多个常量,用逗号分隔;JDK 17 起还支持类型模式(如 case String s -> s.length()):
case "RED", "GREEN", "BLUE" -> "color"-
case Integer i when i > 0 -> i * 2(JDK 21 增强的模式匹配) - 注意:模式匹配需配合
sealed类或具体类型,不能用于任意 Object
必须覆盖所有可能取值(或提供 default)
当 switch 表达式作用于 enum 或 sealed 类时,编译器会检查是否穷尽所有子类型;若未覆盖全部且无 default,编译失败:
立即学习“Java免费学习笔记(深入)”;
- 对 enum:列出所有枚举常量,或加
default分支 - 对非枚举/非密封类(如
String),必须保留default保证完整性 - 返回值类型由所有分支统一决定,例如都返回
int,就不能有分支返回String
嵌套与赋值直接使用
switch 表达式可直接赋值给变量、作为 return 返回、或传入方法参数,无需额外变量临时存储:
String result = switch (day) { case MON, TUE -> "Weekday"; case SAT, SUN -> "Weekend"; default -> "Unknown"; };- 在 lambda 或 stream 操作中也能自然嵌入,提升可读性
- 避免了传统写法中为获取返回值而引入的临时变量和冗余 break


















