本文目录导读:

是的,Java 的模式匹配(Pattern Matching)在近几个版本中持续增强,并且在 Java 21 和 Java 22/23 中有重要更新,截至 2025 年 5 月),最新的 LTS 版本是 Java 21,而 Java 22 和 23 也引入了新的预览特性。
下面梳理一下关键进展:
Java 21(LTS,2023年9月)—— 正式转正
Java 21 是里程碑版本,将之前作为预览的功能正式确定为永久特性:
-
switch模式匹配(JEP 441): 从 Java 17 开始预览,在 Java 21 正式转正。switch可以直接匹配类型、结构(如 Record 模式),并且支持null和守卫模式(when子句)。 -
记录模式(Record Patterns,JEP 440): 正式转正,允许在
instanceof和switch中解构 Record 类型。
示例(Java 21+):
// 1. 模式匹配 + 守卫(when)
String processValue(Object obj) {
return switch (obj) {
case null -> "null value";
case String s when s.length() > 5 -> "Long string: " + s;
case String s -> "Short string: " + s;
case Integer i -> "Integer: " + i;
default -> "Unknown: " + obj;
};
}
// 2. 记录模式解构
record Point(int x, int y) {}
void printSum(Object obj) {
if (obj instanceof Point(int x, int y)) { // 直接解构
System.out.println(x + y);
}
// 也适用于 switch
switch (obj) {
case Point(int x, int y) -> System.out.println(x + y);
default -> {}
}
}
// 3. 嵌套记录模式
record ColoredPoint(Point p, String color) {}
void printColoredPoint(Object obj) {
if (obj instanceof ColoredPoint(Point(int x, int y), String color)) {
System.out.println(color + " at (" + x + ", " + y + ")");
}
}
Java 22(2024年3月)—— 预览特性
-
未命名变量与模式(JEP 456): 正式转正,允许使用下划线 表示不需要使用的变量或模式组件。
if (r instanceof ColoredPoint(_, String color)) { // 忽略坐标 System.out.println(color); } // switch 中忽略分支 case Point(int x, _) -> System.out.println(x); // 只关心 x -
switch表达式中的类型模式优化: 进一步细化,比如当所有 case 都覆盖时,不再需要default(如果编译器能推断出穷尽性)。
Java 23(2024年9月发布预览版 / 2025年3月正式版?)—— 新的预览
重要变化:原始类型模式(Primitive Type Patterns, JEP 488)——目前在 Java 23 中作为预览特性。
- 解决的问题: 目前模式匹配只能用于引用类型(
Object,String,Integer等),不能直接匹配int,long,boolean等基本类型。 - 新能力: 允许在
instanceof和switch中直接匹配基本类型,并结合守卫条件,从而消除大量手动拆箱和类型判断代码。
Java 23 预览示例:
// 传统方式:必须先转为包装类
int x = 42;
if (x instanceof Integer) { ... } // 实际是自动装箱
// Java 23+ 预览:直接匹配基本类型
void testPrimitive(int value) {
switch (value) {
case 0 -> System.out.println("zero");
case 1 -> System.out.println("one");
case int i when i > 100 -> System.out.println("large");
default -> System.out.println("other");
}
}
// 也可以在 instanceof 中使用
boolean isPositive(Object obj) {
return obj instanceof int i && i > 0; // 匹配 int 值
}
| 版本 | 关键增强 | 状态 |
|---|---|---|
| Java 21 | switch 模式匹配、记录模式 |
正式(永久) |
| Java 22 | 未命名变量与模式 () | 正式 |
| Java 23 | 原始类型模式 (int, long 等) |
预览 |
| 未来 | 可能还会扩展模式匹配到数组、泛型等 | 规划中 |
回答你的问题: 是的,Java 的模式匹配在 Java 21(LTS) 已经非常强大和稳定,可以放心在生产中使用,而 Java 23 正在预览对基本类型的直接支持,如果你在尝试最新版 JDK,可以关注这个新能力。
如果你当前用的是 Java 17 或更低版本,建议优先升级到 Java 21,这些模式匹配特性可以显著简化你的条件分支和类型解构代码。