【总原则】
- switch的模式匹配既支持传统语法(case后用冒号),也支持新式语法(case后用箭头)
- switch模式匹配既支持switch语句,也支持switch表达式。
switch(变量) {
case 值1 :(或者->)
代码块 1;
case 值2 :(或者->)
代码块 2;
...
defalut :(或者->)
}
switch(变量) {
case 类型1 模式变量1 :(或者->)
代码块 1;
case 类型2 模式变量2 :(或者->)
代码块 2;
...
defalut :(或者->)
}
例子
class Shape {
}
class Rectangle extends Shape {
}
class Triangle extends Shape {
private double area;
public Triangle(double area) {
this.area = area;
}
}
public class Switch模式匹配 {
public static void test(Shape shape) {
switch (shape) {
case Rectangle rect -> System.out.println("矩形");
case Triangle tri -> System.out.println("三角形");
default -> System.out.println("其他形状");
}
}
public static void test2(Shape shape) {
//当switch变量是Shape类型时,此时只可能是模式匹配的switch
switch (shape) {
case Rectangle rect :
System.out.println("矩形");
break;
case Triangle tri :
System.out.println("三角形");
break;
default :
System.out.println("其他形状");
}
}
public static void main(String[] args) {
test(new Rectangle());
}
}
[switch模式匹配与传统switch区别】
- 在于case后是值,就说明是传统switch;如果case后是类型,那就说明是switch模式匹配。
- 对于传统的switch,switch变量的类型只能是8个基本类型去掉long、String、枚举。
- 对于模式匹配的switch,switch变量的类型可以是任意类型。
- 传统switch是判断switch变量的值;而模式匹配的switch是判断switch变量的类型。
【switch模式匹配的四大特征】
- 增强的类型检查:case先处理子类,后处理父类(先小后大)
- null值处理:支持case null -> 形式;传统switch如果变量是null,就回到NPE。
- switch表达式和语句必须具有完备性,必须覆盖所有的类型,因此通常需要添加defalut分支,除非是密封类。
所谓完备:case分支必须能处理到switch变量所有可能的类型,否则就需要添加default分支。
public static void test(Shape shape) {
switch (shape) {
case null -> System.out.println("为空");
case Rectangle rect -> System.out.println("矩形");
case Triangle tri -> System.out.println("三角形");
case Shape s -> System.out.println("Shape形状");
//由于前面已经有Shape分支对Shape变量的所有可能类型进行兜底
//所以下面的default是多余的,不能有
//default -> System.out.println("其他形状");
}
}
- 模式变量的作用域:模式变量同样是代码块内有效。
- 由于模式变量可用于定义逻辑表达式——因此可以拓展出强大的switch,switch可用于处理范围
例子
public class Switch处理范围 {
public static void judge(Integer score){
String rvt = switch (score) {
case Integer i && i >=90 -> "优秀";
case Integer i && i >=80 -> "良好";
case Integer i && i >=70 -> "中等";
case Integer i && i >=60 -> "及格";
case Integer i -> "不及格";
};
System.out.println(rvt);
}
public static void main(String[] args) {
judge(93);
}
}