В моем предыдущем посте я писал о выражениях переключателей и связанных с ними улучшениях, выпущенных в качестве функции предварительного просмотра для JDK 12. Впоследствии в JDK 13 были предложены некоторые изменения, такие как использование ключевого слова yield для возврата значения из блока переключателей и его отпускание в режиме предварительного просмотра.
В следующем выпуске JDK 14 , который выйдет на GA в марте следующего года, эти изменения в switch будут исключены из предварительного просмотра и станут окончательными и постоянными. В этом посте мы рассмотрим, что изменилось за два выпуска, и перезапустим примеры, которыми я поделился в моем предыдущем посте на JDK 14.
Переключить как выражение
В приведенном ниже фрагменте кода мы увидим, как использовать switch в качестве выражения, то есть оценить некоторые условия и вернуть значение:
|
01
02
03
04
05
06
07
08
09
10
11
|
public static boolean isHealthy(String food){ return switch (food){ case "Fruit" -> true; case "Vegetable" -> true; case "Pizza" -> false; case "Burger" -> false; case "Pulses" -> true; case "Soft Drink" -> false; default -> false; };} |
Мы можем использовать строковые литералы в качестве регистровых выражений, хотя это было невозможно до JDK 12. Выше можно написать с использованием Enums, в этом случае нам не понадобится блок по default :
|
01
02
03
04
05
06
07
08
09
10
|
public static Boolean isHealthEnumVersion(Food food){ return switch (food){ case Fruit -> true; case Vegetable -> true; case Pizza -> false; case Burger -> false; case Pulses -> true; case Soft_Drink -> false; };} |
Перечень Food определяется как:
|
1
2
3
|
enum Food { Fruit, Vegetable, Pizza, Burger, Pulses, Soft_Drink} |
Переключите выражение с блоком кода для оценки случая
В предыдущем примере мы видели, что case обрабатывает только однострочное выражение. Что если мы хотим выполнить несколько операторов, а затем вернуть результат? Это может быть достигнуто с помощью ключевого слова yield .
В JDK 12 ключевое слово break было перегружено, чтобы вернуть значение. Но это не понравилось всем, и поэтому для возврата значения было добавлено новое ключевое слово yield .
Приведенный ниже фрагмент кода выполняет блок кода и возвращает значение:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
public static PreparedFood prepareFood(Food food){ return switch (food){ case Pizza -> { System.out.println("doing pizza related operations"); yield new PreparedFood(food); } case Burger -> { System.out.println("Doing burger related operations "); yield new PreparedFood(food); } default -> { System.out.printf("Doing %s related operations\n", food.toString()); yield new PreparedFood(food); } };} |
yield можно также использовать в старом синтаксисе переключателя, как показано ниже:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
public static PreparedFood prepareFoodOldSyntax(Food food){ return switch (food){ case Pizza: System.out.println("doing pizza related operations"); yield new PreparedFood(food); case Burger: System.out.println("Doing burger related operations "); yield new PreparedFood(food); default: System.out.printf("Doing %s related operations\n", food.toString()); yield new PreparedFood(food); };} |
Исходный код для этого можно найти в репозитории здесь .
|
Опубликовано на Java Code Geeks с разрешения Мохамеда Санауллы, партнера нашей программы JCG . См. Оригинальную статью здесь: JDK 14 — Выражения переключателя JEP 361 из предварительного просмотра Мнения, высказанные участниками Java Code Geeks, являются их собственными. |