从Java 14开始, switch
表达式具有额外的Lambda式 ( case ... -> labels
)语法,它不仅可以用作语句,还可以用作计算为单个值的表达式。
使用新的类似Lambda的语法,如果标签匹配,则仅执行箭头右侧的表达式或语句;否则,仅执行箭头右侧的表达式或语句。 没有跌倒:
var result = switch (str) {
case "A" -> 1 ;
case "B" -> 2 ;
case "C" -> 3 ;
case "D" -> 4 ;
default -> throw new IllegalStateException( "Unexpected value: " + str); };
上面是switch
作为返回单个整数值的表达式的示例。 可以在switch
中将相同的语法用作语句:
int result; switch (str) {
case "A" -> result = 1 ;
case "B" -> result = 2 ;
case "C" -> {
result = 3 ;
System.out.println( "3!" );
}
default -> {
System.err.println( "Unexpected value: " + str);
result = - 1 ;
} }
yield
在case
需要块的case
, yield
可用于从中返回值:
var result = switch (str) {
case "A" -> 1 ;
case "B" -> 2 ;
case "C" -> {
System.out.println( "3!" );
yield 3 ; // return
}
default -> throw new IllegalStateException( "Unexpected value: " + str); };
每种
也可以在每种case
使用以逗号分隔的多个常量,进一步简化了switch
的使用:
var result = switch (str) {
case "A" -> 1 ;
case "B" -> 2 ;
case "C" -> 3 ;
case "D" , "E" , "F" -> 4 ;
default -> 5 ; };
最后的例子
为了演示新的switch
语法,我创建了这个微型计算器:
double calculate(String operator, double x, double y) {
return switch (operator) {
case "+" -> x + y;
case "-" -> x - y;
case "*" -> x * y;
case "/" -> {
if (y == 0 ) {
throw new IllegalArgumentException( "Can't divide by 0" );
}
yield x / y;
}
default -> throw new IllegalArgumentException( "Unknown operator '%s'" .formatted(operator));
}; }
源代码
可以在Github上找到本文的源代码: https : //github.com/kolorobot/java9-and-beyond
参考文献
翻译自: https://www.javacodegeeks.com/2020/05/switch-as-an-expression-in-java-with-lambda-like-syntax.html