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 }; ... }