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" )); 从上面的代码片段中,我们可以看到开关中使用的表达式现在也可以是字符串。 这在语句和表达式中均适用。
 如果要求值的表达式的值不是固定值,则我们需要提供defaultenum
 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