Java 13 introduced the yield
keyword for switch
expressions.
How can I use it and what’s the difference to a default return
or break
value?
Advertisement
Answer
Q&A
How can I use it?
With arrow labels when a full block is needed:
int value = switch (greeting) { case "hi" -> { System.out.println("I am not just yielding!"); yield 1; } case "hello" -> { System.out.println("Me too."); yield 2; } default -> { System.out.println("OK"); yield -1; } };
With traditional blocks:
int value = switch (greeting) { case "hi": System.out.println("I am not just yielding!"); yield 1; case "hello": System.out.println("Me too."); yield 2; default: System.out.println("OK"); yield -1; };
What’s the difference to a default return?
A return
statement returns control to the invoker of a method (§8.4, §15.12) or constructor (§8.8, §15.9) while a yield
statement transfers control by causing an enclosing switch
expression to produce a specified value.
What’s the difference to a break value?
The break
with value statement is dropped in favour of a yield
statement.
Specification
There is Specification for JEP 354 attached to the JLS 13 which sums up everything we need to know about the new switch
. Note that it wasn’t merged into the language specification because it’s still a preview feature and, thus, not yet a permanent part of the language.
A
yield
statement transfers control by causing an enclosingswitch
expression to produce a specified value.YieldStatement: yield Expression;A
yield
statement attempts to transfer control to the innermost enclosing switch expression; this expression, which is called the yield target, then immediately completes normally and the value of theExpression
becomes the value of theswitch
expression.
It is a compile-time error if a
yield
statement has no yield target.It is a compile-time error if the
yield
target contains any method, constructor, initializer, or lambda expression that encloses the yield statement.It is a compile-time error if the
Expression
of ayield
statement is void (15.1).Execution of a
yield
statement first evaluates theExpression
. If the evaluation of theExpression
completes abruptly for some reason, then theyield
statement completes abruptly for that reason. If evaluation of theExpression
completes normally, producing a valueV
, then theyield
statement completes abruptly, the reason being a yield with valueV
.