JEP 441: Pattern Matching for switch 已从 Targeted 状态提升为 Completed 状态,并将在 JDK 21 中正式发布
JEP 441 是 Java 语言的一个重要增强,它为 switch 表达式和语句引入了模式匹配功能。该功能在 JDK 17 首次作为预览功能引入,并在 JDK 18、JDK 19 和 JDK 20 中经过多次预览和反馈优化,最终在 JDK 21 中完成并正式发布。
主要特性
模式匹配的
switch:- 传统的
switch语句和表达式仅支持常量匹配,而新模式匹配允许在case标签中使用模式。 - 该功能增强了代码的安全性,要求
switch语句覆盖所有可能的输入值。 - 与传统的
switch不同,新模式匹配放宽了对null的限制,允许在switch中直接处理null值。
- 传统的
null处理的改进:- 新模式匹配引入了
null作为case标签,减少了处理null选择器表达式时的样板代码和潜在错误。
- 新模式匹配引入了
when子句:when子句允许在case标签中添加额外的条件(守卫),只有当模式匹配且条件为真时,case标签才会生效。
枚举类型的扩展支持:
- 新模式匹配支持在
case标签中使用枚举常量的限定名称,同时保持了与现有 Java 代码的兼容性。
- 新模式匹配支持在
代码示例
模式匹配的 switch
static String formatterPatternSwitch(Object obj) {
return switch (obj) {
case Integer i -> String.format("int %d", i);
case Long l -> String.format("long %d", l);
case Double d -> String.format("double %f", d);
case String s -> String.format("String %s", s);
default -> obj.toString();
};
}null 处理
static void testFooBarNew(String s) {
switch (s) {
case null -> System.out.println("Oops");
case "Foo", "Bar" -> System.out.println("Great");
default -> System.out.println("Ok");
};
}when 子句
static void testStringOld(String response) {
switch (response) {
case null -> { }
case String s when s.equalsIgnoreCase("YES") -> System.out.println("You got it");
case String s when s.equalsIgnoreCase("NO") -> System.out.println("Shame");
case String s -> System.out.println("Sorry?");
}
}未来展望
OpenJDK 团队计划进一步扩展模式匹配的功能,包括:
- 引入 AND 和 OR 模式,以增强
case标签的表达能力。 - 支持 守护模式,允许在
switch语句中使用更复杂的条件逻辑。 - 允许普通类声明 解构模式,指定如何将对象与模式匹配。
开发者资源
- 开发者可以通过 InfoQ 文章 深入了解 Java 模式匹配的详细指南。
- 开发者可以从 JDK 21 Early-Access Builds 下载 OpenJDK 进行实验。
- 也可以使用 SDKMan 管理不同版本的 Java,简化下载和安装过程。
注意事项
这些早期访问版本可能不如最终版本稳定,主要用于测试和反馈。JDK 21 的正式版计划于 2023 年 9 月发布。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。