JEP 354: Switch Expressions (Second Preview)
https://openjdk.org/jeps/354
在新特性中引入了一种新的开关标签 case L ->,表示如果标签匹配,则仅执行标签右侧的代码,箭头后可以是表达式、块或者 throw 语句。
引入->开关后由于每个 case 匹配后只会执行箭头后的代码,因此我们可以不再使用 break 语句,从而避免了 break 所带来的混淆。
另一个好处是,在原来的 switch 中,如果在一个 case 后定义了局部变量,那么他的作用域就是整个 switch 语句,也就是说在一个 switch 语句中不能定义两个一样带局部变量。而在新特性中,开关标签 case L ->后定义的局部变量只会作用于这一个 case。例如:
switch (day) {
case MONDAY:
case TUESDAY:
int temp = ... // The scope of 'temp' continues to the }
break;
case WEDNESDAY:
case THURSDAY:
int temp2 = ... // Can't call this variable 'temp'
break;
default:
int temp3 = ... // Can't call this variable 'temp'
}
//而在新的switch中,可以重复:
switch (i){
case 1 -> {
int a = 1;
System.out.println(a);
}
case 2 -> {
int a = 2; // 同样将临时变量定义为a
System.out.println(a);
}
default -> {
int a = 2; // 同样将临时变量定义为a
System.out.println(a);
}
}
另一个特点是我们可以扩展 switch 语句为一个表达式。表达式的结果可以用于给其他变量赋值,直接使用 sout 输出等。如果 ->后直接一个值,则该值代表 switch 表达式的结果。如果 ->是一个代码块,则可以使用 yield关键字来指定表达式的值。
eg:
int result = switch (s) {
case "Foo":
yield 1;
case "Bar":
yield 2;
default:
System.out.println("Neither Foo nor Bar, hmmm...");
yield 0;
};
1048

被折叠的 条评论
为什么被折叠?



