Q & A
Как я могу его использовать?
С метками со стрелками, когда необходим полный блок:
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;
}
};
Для традиционных блоков:
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;
};
В чем разница с возвратом по умолчанию?
A *Оператор 1023 * возвращает управление вызывающему методу ( §8.4 , §15.12 ) или конструктору ( §8.8, §15.9 ), в то время как оператор yield
передает управление с помощью , в результате чего включающее выражение switch
создает указанное значение.
В чем разница со значением разрыва?
Оператор break
со значением отбрасывается в пользу оператора yield
.
Спецификация
Существует Спецификация для JEP 354 , прикрепленной к JSL 13 , которая суммирует все, что нам нужно знать о новом switch
.Обратите внимание, что он не был объединен со спецификацией языка, потому что он все еще является функцией предварительного просмотра и, таким образом, еще не является постоянной частью языка.
A yield
операторпередает управление, заставляя вмещающее выражение switch
генерировать указанное значение.
YieldStatement:
yield Expression;
A yield
оператор пытается передать управление в самое внутреннее выражение переключения переключателя;это выражение, которое называется целевым значением доходности , затем сразу же нормально завершается, и значение Expression
становится значением выражения switch
.
Это ошибка времени компиляции, если у оператора yield
нет цели выхода.
Это ошибка времени компиляции, если цель yield
содержит какой-либо метод, конструктор, инициализаторили лямбда-выражение, которое содержит оператор yield.
Ошибка времени компиляции, если Expression
оператора yield
void (15.1).
Выполнение оператора yield
сначала оценивает Expression
.Если по какой-либо причине оценка Expression
завершается преждевременно, то по этой причине оператор yield
завершается преждевременно.Если оценка Expression
завершается нормально, производя значение V
, то оператор yield
завершается внезапно, причиной чего является доходность со значением V
.