53. Using yield in switch expressions
Here, we’re going to look at how switch
expressions have evolved in JDK 13+.
Java SE 13 added the new yield
statement, which can be used instead of the break
statement in switch expressions.
We know that a JDK 12+ switch
expression can be written as follows (playerType
is a Java enum):
return switch (playerType) {
case TENNIS ->
new TennisPlayer();
case FOOTBALL ->
new FootballPlayer();
...
};
Moreover, we know that a label’s arrow can point to a curly-braces block as well (this works only in JDK 12, not in JDK 13+):
return switch (playerType) {
case TENNIS -> {
System.out.println("Creating a TennisPlayer ...");
break new TennisPlayer();
}
case FOOTBALL -> {
System.out.println("Creating a FootballPlayer ...");
break new FootballPlayer();
}
...
};
Since break
can be confusing because it can be used in old-school switch
statements and in the new switch
expressions, JDK 13 added the yield
statement to be used instead of break
. The yield
statement takes one argument representing the value produced by the current case. The previous examples can be written from JDK 13+ as follows:
return switch (playerType) {
case TENNIS:
yield new TennisPlayer();
case FOOTBALL:
yield new FootballPlayer();
...
};
return switch (playerType) {
case TENNIS -> {
System.out.println("Creating a TennisPlayer ...");
yield new TennisPlayer();
}
case FOOTBALL -> {
System.out.println("Creating a FootballPlayer ...");
yield new FootballPlayer();
}
...
};
In other words, starting with JDK 13+, a switch
expression can rely on yield
but not on break
, and a switch
statement can rely on break
but not on yield
.