在我以前的文章中 ,我写了有关作为JDK 12的预览功能发布的开关表达式和相关增强功能的信息。随后,在JDK 13中提出了一些更改,例如使用yield
关键字从switch块返回值并在预览中发布。
在即将于明年3月在GA上发布的即将发布的JDK 14版本中,这些switch
更改将无法预览,并将永久且永久化。 在本文中,我们将研究两个版本之间的变化,并重新运行我在上一篇关于JDK 14的文章中共享的示例。
切换为表达式
在下面的代码片段中,我们将看到如何将switch
用作表达式,即评估一些条件并返回值:
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 ; }; }
我们可以使用字符串文字作为大小写表达式,而在JDK 12之前是不可能的。以上情况可以使用Enums编写,在这种情况下,我们不需要default
块:
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 ; }; }
Food
枚举定义为:
enum Food { Fruit, Vegetable, Pizza, Burger, Pulses, Soft_Drink }
使用代码块切换表达式以进行案例评估
在前面的示例中,我们看到该case
仅处理单个行表达式。 如果我们想执行多个语句然后返回结果怎么办? 这可以使用yield
关键字实现。
在JDK 12中, break
关键字被重载以返回该值。 但这并不是所有人都喜欢的,因此添加了新的关键字yield
来返回值。
下面的代码段执行一个代码块并返回一个值:
public static PreparedFood prepareFood(Food food){ return switch (food){ case Pizza -> { System.out.println( "doing pizza related operations" ); yield new PreparedFood(food); } case Burger -> { System.out.println( "Doing burger related operations " ); yield new PreparedFood(food); } default -> { System.out. printf ( "Doing %s related operations\n" , food.toString()); yield new PreparedFood(food); } }; }
yield
也可以在旧的switch语法中使用,如下所示:
public static PreparedFood prepareFoodOldSyntax(Food food){ return switch (food){ case Pizza: System.out.println( "doing pizza related operations" ); yield new PreparedFood(food); case Burger: System.out.println( "Doing burger related operations " ); yield new PreparedFood(food); default : System.out. printf ( "Doing %s related operations\n" , food.toString()); yield new PreparedFood(food); }; }
源代码可以在此处的存储库中找到 。
翻译自: https://www.javacodegeeks.com/2020/01/jdk-14-jep-361-switch-expressions-out-from-preview.html