JDK 12 – JEP 325开关表达式

JDK 12于2019年3月19 上线GA,继续致力于缩短发布周期和频繁发布。 该版本的功能部分可以在这里找到。 对于开发人员来说,有趣的功能之一是“ JEP 325开关表达式 ”,它可以作为预览功能使用。

此处定义的预览功能是:

预览语言或VM功能是Java SE平台的一项新功能,该功能已完全指定,完全实现但不是永久性的。 JDK功能发布中提供了该功能,以根据实际使用情况激发开发人员反馈。 这可能会导致它在将来的Java SE平台中永久存在。

在本文中,我将向您展示switch是如何从一个语句变成一个表达式的。 语句是可以执行但不会求值的东西,而表达式是在执行时可以求值的东西:

 //Statement  System.out.println( "This is a statement" );  //Expression  6 + 5 ; 

切换为表达式

开关作为表达式的语法已更改:

 Object switchResult = switch ( variable ) { 
     case choice1 -> result1; 
     case choice2 -> result2; 
     default -> resultDefault;  } 

除了上述使用开关之外,它还可以用作语句:

 switch ( variable ) { 
     case choice1: 
       doSomeThing(); 
       break ; 
     case choice2: 
       doOtherThing(); 
       break ; 
     default : 
       doDefaultThing();  } 

我并没有打算介绍switch表达式。 你可以在这里阅读。 本文的其余部分将显示如何将开关用作表达式。 下面的代码片段显示了switch作为表达式的用法,请注意,switch现在产生的值在这种情况下为boolean

 public static boolean isHealthy(String food){ 
     return switch (food){ 
         case "Fruit" -> true ; 
         case "Vegetable" -> true ; 
         case "Pizza" -> false ; 
         case "Burger" -> false ; 
         case "Pulses" -> true ; 
         case "Soft Drink" -> false ; 
         default -> false ; 
     };  }  System.out.printf( "Fruit is %s\n" , isHealthy( "Fruit" )); 

从上面的代码片段中,我们可以看到开关中使用的表达式现在也可以是字符串。 这在语句和表达式中均适用。

如果要求值的表达式的值不是固定值,则我们需要提供default块。 如果我们使用enum作为开关表达式,则无需提供默认情况,因为枚举中可能的结果仅限于枚举值。 在下面的示例中显示:

 enum Food { 
     Fruit, Vegetable, Pizza, Burger, Pulses, Soft_Drink  }  public static boolean isHealthEnumVersion(Food food){ 
     return switch (food){ 
         case Fruit -> true ; 
         case Vegetable -> true ; 
         case Pizza -> false ; 
         case Burger -> false ; 
         case Pulses -> true ; 
         case Soft_Drink -> false ; 
     };  }  System.out.printf( "Pizze is %s\n" , isHealthEnumVersion(Food.Pizza)); 

另一个示例,我们将方法评估的结果作为表达式放入开关中:

 public static int evaluateLunch(Food food){ 
     return switch (isHealthEnumVersion(food).toString()){ 
         case "true" -> 10 ; 
         case "false" -> 5 ; 
         default -> 0 ; 
     };  }  System.out.printf( "Your food received %d points\n" , 
         evaluateLunch(Food.Burger)); 

代码块作为案例评估

在前面的示例中,我们看到案例是针对单行表达式映射的。 当我们需要针对案例评估代码块时,我们该如何处理?

 public static PreparedFood prepareFood(Food food){ 
     return switch (food){ 
         case Pizza -> { 
             System.out.println( "doing pizza related operations" ); 
             break new PreparedFood(food); 
         } 
         case Burger -> { 
             System.out.println( "Doing burger related operations " ); 
             break new PreparedFood(food); 
         } 
         default -> { 
             System.out.printf( "Doing %s related operations\n" , 
                food.toString()); 
             break new PreparedFood(food); 
         } 
     };  } 

您可能会注意到break已得到增强,可以接受参数,该参数成为针对案例评估代码块的结果。

使用旧语法切换为表达式

我们可以坚持使用switch的旧语法,即不使用->符号,如下所示:

 public static int evaluateLunchOldWay(Food food){ 
     return switch (isHealthEnumVersion(food).toString()){ 
         case "true" : break 10 ; 
         case "false" : break 5 ; 
         default : break 0 ; 
     };  } 

可以在这里找到本文的完整代码。

翻译自: https://www.javacodegeeks.com/2019/04/jdk-12-jep-325-switch-expressions.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值