switch表达式将语句转为返回值,用→替代break防穿透;支持多值case、大括号+yield处理多行逻辑;强制穷尽覆盖(enum需全列或default,string/object必有default);结合模式匹配可类型检查+解构+守卫条件+null匹配。

直接用 switch 表达式替代传统语句,核心是把“执行动作”变成“返回值”,同时用箭头语法替代 break,代码更短、更安全、不易出错。
用箭头语法写单行分支
每个 case 后面用 ->,右边直接写表达式,自动作为该分支的返回值,不用 break,也不会意外穿透。
- 传统写法要写 break,漏一个就出问题;新写法天然防穿透
- 字符串、枚举、基本类型都支持,比如
case "A", "B" -> "valid" - 多个值用逗号分隔,语义清晰,避免重复 case
多行逻辑用大括号 + yield
如果一个分支需要做几件事(比如打印日志再计算),就用 { } 包裹,最后用 yield 显式返回结果。
- 箭头右边是单个表达式时,自动 yield;是代码块时,必须写 yield
- 例如:
case "DEBUG" -> { log("entering debug"); yield 100; } - 不写 yield 会编译失败,强制你明确返回意图
确保所有情况都被覆盖
作为表达式,switch 必须有确定的返回值。编译器会检查是否穷尽——对 enum 类型,所有常量都要列出来或加 default;对 String 或 Object,则必须有 default 分支。
- 没写 default 且类型是 enum?编译报错:“does not cover all possible values”
- default 不是可选项,而是安全底线,避免运行时意外
- 配合 sealed class 使用时,还能实现完全穷尽,连 default 都可能省掉
结合模式匹配处理对象类型
Java 17 支持在 case 中直接匹配类型并解构变量,比如 case String s -> s.length(),省去 instanceof 和强转。
- 类型检查和变量绑定一步完成,代码更紧凑
- 支持守卫条件:
case Integer i when i > 0 -> "positive" - null 也能单独匹配:
case null -> "empty",无需额外判空
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











