В моем предыдущем посте я писал о выражениях переключателей и связанных с ними улучшениях, выпущенных в качестве функции предварительного просмотра для 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, являются их собственными. |