New Java Feature - Pattern Matching
概述
- Java 模式匹配是一个新型的、而且还在持续快速演进的领域
- 类型匹配是模式匹配的一个规范,在 JDK 16 正式发布
- 一个模式是匹配谓词和匹配变量的组合
- 匹配谓词用来确定模式和目标是否匹配
- 在模式和目标匹配的情况下,匹配变量是从匹配目标里提取出来的一个或者多个变量
- 对于类型匹配来说,匹配谓词用来指定模式的数据类型,而匹配变量就是属于该类型的数据变量
- 对于类型匹配来说,匹配变量只有一个
模式
1 | static boolean isSquare(Shape shape) { |
模式拆分 - 类型判断 + 类型转换 - 增加出错概率
- 类型判断语句 - 匹配谓词
- 类型转换语句
- 声明一个新的本地变量,即匹配变量,来承载转换后的数据
类型匹配
1 | if (shape instanceof Rectangle rect) { |
使用类型匹配的代码,只有匹配谓词和本地变量两部分,并且在同一个语句里
- 如果目标变量是一个长方形的实例,那么这个目标变量就会被赋值给一个本地的长方形变量,即匹配变量,否则不会被赋值
- Java 编译器不允许使用没有赋值的匹配变量
使用匹配变量的条件语句 else 分支并没有声明这个匹配变量 - 作用域 - 类型匹配的关键
匹配变量的作用域
只有明确匹配,才能使用
- 匹配变量的作用域,就是目标变量可以被确认匹配的范围
- 如果在一个范围内,无法确认目标变量是否被匹配,或者目标变量不能被匹配,都不能使用目标变量
- 编译器角度 - 在一个范围里,如果编译器能够确定匹配变量已经被赋值,那么它就可以在这个范围内使用
- 如果编译器无法确定匹配变量是否被赋值,或者确定没有被赋值,那么它就不能在这个范围内使用
Case 1
1 | public static boolean isSquare(Shape shape) { |
Case 2
1 | public static boolean isSquare(Shape shape) { |
Case 3
1 | public static boolean isSquare(Shape shape) { |
Case 4
类型不匹配,才能进行下一步运算,即编译器明确知道匹配变量没有被赋值
Case 5
& 运算符两侧的表达式都要参与计算 - 无论左侧的类型匹配与否,右侧的匹配变量都要使用 - 违反了匹配变量的作用域原则 - 编译器无法确认匹配变量是否被赋值
Case 6
- 定义了一个静态变量,它和匹配变量同名
- 在匹配变量的作用域内,除非特殊处理,否则这个静态变量就被遮掩住了 - 影子变量 - Shadowed Variable
性能提升
20%
1 | Benchmark Mode Cnt Score Error Units |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.