1、使用case L ->箭头标签的switch代码
1)JDK13以前的switch代码
switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
System.out.println(6);
break;
case TUESDAY:
System.out.println(7);
break;
case THURSDAY:
case SATURDAY:
System.out.println(8);
break;
case WEDNESDAY:
System.out.println(9);
break;
}
2)JDK13新写法switch代码
switch (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}
2、使用case L -> 箭头标签简化的写法
除了case L :
开关模块中的传统标签外,我们还提出了一种带有case L ->
标签的简化形式。如果标签匹配,则仅执行箭头右侧的表达式或语句;否则,将不执行任何操作。没有失败。例如,给定以下switch使用新标签形式的语句:
static void howMany(int k) {
switch (k) {
case 1 -> System.out.println("one");
case 2 -> System.out.println("two");
default -> System.out.println("many");
}
}
如下代码:
howMany(1);
howMany(2);
howMany(3);
结果如下:
one
two
many
3、使用switch表达式
我们将扩展该switch语句,以便可以将其用作表达式。例如,howMany可以将以前的方法重写为使用switch表达式,因此它仅使用单个println。
static void howMany(int k) {
System.out.println(
switch (k) {
case 1 -> "one"
case 2 -> "two"
default -> "many"
}
);
}
在通常情况下,switch表达式将如下所示:
T result = switch (arg) {
case L1 -> e1;
case L2 -> e2;
default -> e3;
};
4、switch中使用yield返回值
大多数switch表达式在“ case L ->”
开关标签的右侧都有一个表达式。如果需要一个完整的块,我们引入一个新的yield语句来产生一个值,该值成为封闭switch表达式的值。
int j = switch (day) {
case MONDAY -> 0;
case TUESDAY -> 1;
default -> {
int k = day.toString().length();
int result = f(k);
yield result;
}
};
这两个语句break
带有或不带有标签)和yield
便于在switch语句和switch表达式之间消除歧义:switch
语句而不是switch表达式可以成为break
语句的目标;和switch表达,但不是一个switch
语句可以是一个目标yield的语句。
switch表达式必须以一个值正常完成,或者必须通过引发异常来突然完成。
int i = switch (day) {
case MONDAY -> {
System.out.println("Monday");
// ERROR! Block doesn't contain a yield statement
}
default -> 1;
};
i = switch (day) {
case MONDAY, TUESDAY, WEDNESDAY:
yield 0;
default:
System.out.println("Second half of the week");
// ERROR! Group doesn't contain a yield statement
};
控制语句,break
,yield
,return
和continue
,无法通过跳switch
表达式,如在以下内容:
for (int i = 0; i < MAX_VALUE; ++i) {
int k = switch (e) {
case 0:
yield 1;
case 1:
yield 2;
default:
continue z;
// ERROR! Illegal jump through a switch expression
};
...
}