Java switch模式匹配将类型检查、强转和变量使用合并为一步,支持类型模式、守卫条件、null处理及record解构,提升安全性与简洁性。

Java 中 switch 语句利用模式匹配简化类型判断,核心是把“检查类型 + 强制转换 + 使用变量”三步合并为一步,在 case 中直接声明带类型的模式变量,既安全又简洁。
类型模式:替代 instanceof + 强转
传统写法需先判断再强转,容易出错且啰嗦:
- if (obj instanceof String) { String s = (String) obj; ... }
- 重复写类型、漏括号、类型不一致都可能引发运行时异常
Java 17+ 支持在 case 后直接写 类型 变量名,自动完成类型校验与绑定:
- case String s -> System.out.println(s.length());
- case Integer i -> System.out.println(i * 2);
- 变量 s 和 i 在该分支内直接可用,编译器确保非 null 且类型准确
支持守卫条件(when 子句)
可在类型匹配基础上追加逻辑判断,避免嵌套 if:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
- case Double d when d > 0 -> System.out.println("正浮点数");
- case List> list when !list.isEmpty() -> process(list);
- 守卫条件只在类型匹配成功后执行,语义清晰、不易出错
null 和 default 的显式处理
switch 模式匹配天然支持 null 分支,无需额外空指针防护:
- case null -> throw new IllegalArgumentException("输入为空");
- default -> throw new UnsupportedOperationException("不支持类型: " + obj.getClass());
- 缺省分支必须显式覆盖,否则遇到未定义类型会抛 MatchException,强制兜底意识
Java 21 起:记录模式解构嵌套结构
当对象是 record 类型时,case 可直接解构字段,跳过 getter 调用:
- record User(String name, int age) {}
- case User(String n, int a) when a >= 18 -> greet(n);
- 更深层嵌套也支持:case User(String n, Address(String city, String zip)) -> ...
- 字段名可省略为 _(Java 22 预览),仅需提取部分字段时更干净

















