一、switch定义
二、基本语法
switch (expression) {
case value1:
// 当expression的值等于value1时执行的代码
break; // 可选
case value2:
// 当expression的值等于value2时执行的代码
break; // 可选
// 你可以有任意数量的case语句
default: // 可选
// 当没有case匹配时执行的代码
}
- expression:这是被评估的表达式,其结果必须与case标签后面的值进行比较。从Java 7开始,
switch
语句的表达式可以是String类型,或其他枚举类型,但在此之前,它只能是:byte、short、char、int、Character、Byte、Short、Integer、String(Java 7及以上版本)、Enum(Java 5及以上版本)的包装类或这些类型的表达式。- break省略:会导致case穿透!!!
2-1、case穿透
就是语句体中没有写break导致的。
执行流程:
首先还是会拿着小括号中表达式的值跟下面每一个case进行匹配。如果匹配上了,就会执行对应的语句体,如果此时发现了break,那么结束整个switch语句。如果没有发现break,那么程序会继续执行下一个case的语句体,一直遇到break或者右大括号为止。
使用场景:
如果多个case语句重复了,可以使用case穿透简化代码。
三、switch表达式(新特性)
3-1、简化写法
3-2、预览功能
从Java 12开始,Java引入了switch
表达式作为预览功能(Preview Feature)。switch
表达式与传统的switch
语句不同,它必须返回一个值,并且其语法更加紧凑和灵活。
1、基本语法
<Type> result = switch (expression) {
case value1 -> {
// 当expression的值等于value1时执行的代码,并返回结果
// 可以是单一表达式或代码块
}
case value2 -> result2; // 单一表达式
// 可以有多个case
default -> {
// 当没有case匹配时执行的代码,并返回结果
// 可以是单一表达式或代码块
}
};
<Type>
是switch
表达式必须返回的类型。->
符号用于分隔每个case
的条件和该条件满足时要执行(并返回)的表达式或代码块。- 如果
case
后面跟的是代码块(即使用大括号{}
包围的代码),则代码块内的最后一条语句(或显式返回语句)的结果将作为该case
的返回值。- 如果没有
default
分支,且没有case
匹配,则编译时会报错(除非使用了yield
关键字,这是后续版本中的增强)。- case中可以不写break,不会有穿透现象。
示例:
String dayOfWeek = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> "Weekend vibes";
case TUESDAY -> "Midweek struggles";
case THURSDAY -> "Almost there!";
case WEDNESDAY, SATURDAY -> {
// 使用代码块进行更复杂的操作
System.out.println("Special day!");
yield "Special treatment";
}
default -> "Unknown day";
};
System.out.println(dayOfWeek);
注意:上面的
yield
关键字是Java 14中引入的,用于在switch
表达式的代码块中显式地提供返回值。在Java 12和13中,如果你需要在
case
的代码块中返回值,你必须使用返回语句(如return
),但这通常意味着switch
表达式需要嵌套在一个更大的方法中,因为switch
表达式本身不能包含返回语句(除非它是方法的一部分)。
四、switch vs if
- if:一般用于对范围的判断;
- switch:把有限个数据一一列举出来,让我们任选其一。