这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战
欢迎关注公众号OpenCoder,来和我做朋友吧~❤😘😁🐱🐉👀
简介
Pattern Matching for switch(Preview)
在switch中使用模式匹配,预览版本。
预览版本
- 有可能在之后的版本删除
- 有可能计划进一步增强
在 Java 16 中, JEP 394 扩展了 instanceof 运算符以采用类型模式并执行模式匹配。
1 | java复制代码static String formatter(Object o){ |
在Java 17中, JEP406
switch 是模式匹配的完美匹配!如果我们扩展 switch 语句和表达式以适用于任何类型,并允许使用模式而不是常量进行 case 标签,那么我们可以更清晰可靠地重写上述代码
1 | java复制代码static String formatterPatternSwitch(Object o) { |
- 好处
+ 语义更清晰:“参数 o 最多匹配以下条件之一”
+ 在这种情况下,我们更有可能在 O(1) 时间内执行调度(==效率高==)。我们用断点调试这两段代码
- **if...else**
逐行校验
- **switch**
直接到default
- switch模式匹配的目标
+ 通过允许模式出现在 case 中,扩展 switch 表达式和语句的表现力和适用性。
+ 允许switch的case使用null
+ 引入两种新的模式:保护模式,允许使用任意布尔表达式来改进模式匹配逻辑,以及带括号的模式,以解决一些解析歧义。
+ 确保所有现有的 switch 表达式和语句在没有更改的情况下继续编译并以相同的语义执行。
+ 确保和旧版本switch表达式和语句的兼容性
语法
增强 switch 语句和表达式两种方式
- 扩展
case
语句中除常量外,还可以使用模式匹配 - 除了案例中的模式,还有两种新的模式:保护模式和括号模式。
对于模式匹配有四个特点
- 增强的类型检查:选择器表达式的类型包括:基本类型或任何引用类型(包括null)。
1 | java复制代码Point(int i, int j) {} |
- switch 表达式和语句的完整性
+ 存在子父类关系
1 | java复制代码// 错误 |
+ 缺少default
1 | java复制代码// 错误 |
+ 类型匹配检查
sealed是密封类的语法,我们会在文章后续进行探讨。
表示可以实现接口S的类有 A,B,C
1 | java复制代码sealed interface S permits A, B, C {} |
- 模式变量声明的范围
+ case语句后箭头右侧可以出现的内容:
- 表达式
- 代码块
- throw语句
1 | java复制代码static void test(Object o) { |
- 保护模式和括号模式。
- 保护模式:我们可以添加一种称为保护模式的新模式,写作 【表达式1】 && 【表达式2】,它允许通过任意布尔表达式对模式进行细化。
- 括号模式:给任意布尔表达式加上括号,以避免解析歧义
1 | java复制代码class Shape {} |
- 处理null值
- 在case中可以使用null
- 以及null引出的新的模式:case null,其他 ->
1 | java复制代码static void test(Object o) { |
参考资源
下期预告
下期我们将一起学习探讨Sealed Classes密封类
本文转载自: 掘金