2020年3月发布的JDK 14附带了switch语句的更新版本。 这是JDK 12和JDK 13中的预览功能。
要了解差异,让我们看一个简单的示例。 假设我们要基于DayOfWeek枚举来计算每日工作时间。
使用旧的使用switch语句的方法,我们的解决方案可能如下所示:
DayOfWeek day = ... float expectedWorkingTime; switch (day) { case MONDAY: case TUESDAY: case WEDNESDAY: case THURSDAY: expectedWorkingTime = 8f; break ; case FRIDAY: expectedWorkingTime = 6f; break ; default : expectedWorkingTime = 0f; }
使用新的switch语句(或表达式),我们可以像这样重写示例:
DayOfWeek day = ... final float expectedWorkingTime = switch (day) { case MONDAY, TUESDAY, WEDNESDAY, THURSDAY -> 8f; case FRIDAY -> 6f; default -> 0f; };
因此,新功能:
- switch关键字可用作表达式并返回一个值。 在此示例中,开关返回的值被分配给ExpectedWorkingTime。 请注意,这使我们可以使ExpectedWorkingTime为final,这在以前的解决方案中是不可能的。
- 一个case语句可以包含多个值,以逗号分隔。
- 在case语句中,冒号替换为箭头(->)
- 使用箭头(->)语法时,不需要break关键字。 如果您更喜欢使用break,则在某些情况下仍可以使用较早的冒号语法。
新的收益声明
在前面的示例中,我们在箭头(->)的右侧返回一个简单值。 但是,也许我们需要首先计算该值,为此我们可能需要一些额外的代码行。
例如:
final float expectedWorkingTime = switch (day) { case MONDAY, TUESDAY, WEDNESDAY, THURSDAY -> { if (isFullTimeEmployee) { yield 8 ; } yield 4 ; } case FRIDAY -> 6f; default -> 0f; };
在这里,我们在第一个case语句中使用一个代码块来确定工作时间。 使用新的yield语句,我们从case块返回一个值(就像在方法中使用return一样)。
您可以在GitHub上找到本文中显示的示例。
翻译自: https://www.javacodegeeks.com/2020/04/java-14-looking-at-the-updated-switch-statement.html