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