JDK 14, released in March 2020, comes with an updated version of the switch statement. This has been a preview feature in JDK 12 and JDK 13.
To see the difference, let's look at a simple example. Assume we want to compute the daily working time based on a DayOfWeek enum.
With the old way of using the switch statement, our solution might look like this:
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; }
With the new switch statement (or expression) we can rewrite our example like this:
DayOfWeek day = ... final float expectedWorkingTime = switch (day) { case MONDAY, TUESDAY, WEDNESDAY, THURSDAY -> 8f; case FRIDAY -> 6f; default -> 0f; };
So, what's new:
- The switch keyword can be used as expression and return a value. In this example the value returned by switch is assigned to expectedWorkingTime. Note that this allows us to make expectedWorkingTime final which was not possible in the previous solution.
- A case statement can contain multiple values, separated by comma.
- In the case statement, colon is replaced with an arrow (->)
- When using the arrow (->) syntax, no break keyword is required. If you prefer using break, you can still use the older colon syntax for cases.
The new yield statement
In the previous example we return a simple value on the right side of the arrow (->). However, maybe we need to compute this value first, for which we might need a few extra lines of code.
For example:
final float expectedWorkingTime = switch (day) { case MONDAY, TUESDAY, WEDNESDAY, THURSDAY -> { if (isFullTimeEmployee) { yield 8; } yield 4; } case FRIDAY -> 6f; default -> 0f; };
Here we use a code block in the first case statement to determine the working time. With the new yield statement we return a value from a case block (like using return in methods).
You can find the examples shown in this post on GitHub.
Leave a reply