在我以前的文章中 ,我写了有关作为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