模式匹配

匹配谓词 + 匹配变量

  1. Java 模式匹配是一个新型的、还在持续快速演进的领域
  2. 类型匹配模式匹配的一个规范,在 JDK 16 正式发布
  3. 一个模式匹配谓词匹配变量的组合
    • 匹配谓词用来确定模式和目标是否匹配
    • 模式和目标匹配的情况下,匹配变量是从匹配目标提取出来的一个或多个变量
  4. 类型匹配来说
    • 匹配谓词用来指定模式的数据类型
    • 匹配变量数属于该类型数据变量 - 只有一个

类型转换

生产力低下 - 类型判断 + 类型转换

image-20241205102453610

  1. 类型判断语句,即匹配谓词 - shape instanceof Rectangle
  2. 类型转换语句,使用类型转换运算符 - (Rectangle) shape
  3. 声明一个新的本地变量,即匹配变量,来承载类型转换后的数据 - Rectangle rectangle =

类型匹配

image-20241205104143126

都在同一个语句中,只有匹配谓词本地变量两部分

d9882c077deb68b2675f68c5794840d1

避免误用 - 编译器不会允许使用没有赋值匹配变量

image-20241205104903129

作用域

匹配变量的作用域

image-20241205105347888

  1. 匹配变量的作用域,即目标变量可以被确认匹配的范围
    • 如果在一个范围内,无法确认目标变量是否被匹配,或者目标变量不能被匹配,都不能使用匹配变量
  2. 编译器视角 - 明确被赋值 - 才能使用
    • 在一个范围内,如果编译器能够确定匹配变量已经被赋值,那么它可以在这个范围内使用
    • 如果编译器无法确定匹配变量是否被赋值,或者确定没有被赋值,则不能在这个范围内使用

确认匹配

1
2
3
4
5
6
7
8
public static boolean isSquare(Shape shape) {
if (shape instanceof Rectangle rectangle) {
// rectangle is in scope here
return rectangle.length() == rectangle.width();
}
// rectangle is out of scope here
return shape instanceof Square;
}

确认不匹配

1
2
3
4
5
6
7
8
9
public static boolean isSquare(Shape shape) {
if (!(shape instanceof Rectangle rectangle)) {
// rectangle is out of scope here
return shape instanceof Square;
}

// rectangle is in scope here
return rectangle.length() == rectangle.width();
}

紧凑方式

1
2
3
4
public static boolean isSquare(Shape shape) {
return shape instanceof Square
|| (shape instanceof Rectangle rectangle && rectangle.length() == rectangle.width());
}
1
2
3
4
public static boolean isSquare(Shape shape) {
return shape instanceof Square
|| (!(shape instanceof Rectangle rectangle) || rectangle.length() == rectangle.width());
}

位运算两侧的运算都要执行,不存在逻辑关系,无法保证一定类型匹配,编译器无法确定类型一定匹配

image-20241205112303425

Shadowed Variable

image-20241205112557541

image-20241205112951576