使用类似Lambda的语法切换为Java中的表达式

从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需要块的caseyield可用于从中返回值:

 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值