В Java 13 выражение JEP 354: Переключение расширяет предыдущее Java 12 Переключает выражения , добавляя новый выход
ключевое слово для возврата значения из выражения switch.
P.S Выражения переключения являются функцией предварительного просмотра и по умолчанию отключены.
Примечание Это стандартная функция в Java 14 .
1. Больше никаких ценностных разрывов!
1.1 Java 12 разрывы значений
синтаксис больше не компилируется в Java 13, использует yield
вместо этого.
// value breaks are superseded by Java 13 'yield' statements. private static int getValueViaBreak(String mode) { int result = switch (mode) { case "a": case "b": break 1; case "c": break 2; case "d": case "e": case "f": break 3; default: break -1; }; return result; }
1.2 В Java 13 мы можем использовать yield
для возврата значения.
private static int getValueViaYield(String mode) { int result = switch (mode) { case "a", "b": yield 1; case "c": yield 2; case "d", "e", "f": // do something here... System.out.println("Supports multi line block!"); yield 3; default: yield -1; }; return result; }
1.3 Правила меток или стрелки из выражения switch
(Java 12) все еще поддерживаются в Java 13.
private static int getValueViaArrow(String mode) { int result = switch (mode) { case "a", "b" -> 1; case "c" -> 2; case "d", "e", "f" -> { // do something here... System.out.println("Supports multi line block!"); yield 3; } default -> -1; }; return result; }
2. Выражения переключения Java 13
Полный пример выражения switch
в Java 13.
package com.mkyong.java13; public class JEP354 { public static void main(String[] args) { System.out.println(getValueViaYield("a")); System.out.println(getValueViaYield("c")); System.out.println(getValueViaYield("e")); System.out.println(getValueViaYield("z")); } // Traditional switch private static int getValueBefore12(String mode) { int result; switch (mode) { case "a": case "b": result = 1; break; case "c": result = 2; break; case "d": case "e": case "f": result = 3; break; default: result = -1; } ; return result; } // Java 12, multiple comma-separated labels private static int getValueMultipleLabels(String mode) { int result; switch (mode) { case "a", "b": result = 1; break; case "c": result = 2; break; case "d", "e", "f": result = 3; break; default: result = -1; } ; return result; } // Java 13, value breaks are superseded by 'yield' statements // Java 12, switch expression returning value via break /*private static int getValueViaBreak(String mode) { int result = switch (mode) { case "a": case "b": break 1; case "c": break 2; case "d": case "e": case "f": break 3; default: break -1; }; return result; }*/ // Java 12, switch expression returns a value via label rules (arrow) private static int getValueViaArrow(String mode) { int result = switch (mode) { case "a", "b" -> 1; case "c" -> 2; case "d", "e", "f" -> { // do something here... System.out.println("Supports multi line block!"); yield 3; } default -> -1; }; return result; } // Java 13, switch expression returns a value via yield private static int getValueViaYield(String mode) { int result = switch (mode) { case "a", "b": yield 1; case "c": yield 2; case "d", "e", "f": // do something here... System.out.println("Supports multi line block!"); yield 3; default: yield -1; }; return result; } }
Выход
1 2 Supports multi line block! 3 -1
3. Включить функции предварительного просмотра
3.1 Обычная javac
компиляция вызовет следующие ошибки:
$ javac JEP354.java D:\test>javac JEP354.java JEP354.java:39: error: multiple case labels are a preview feature and are disabled by default. case "a", "b": ^ (use --enable-preview to enable multiple case labels) JEP354.java:76: error: switch expressions are a preview feature and are disabled by default. int result = switch (mode) { ^ (use --enable-preview to enable switch expressions) JEP354.java:77: error: switch rules are a preview feature and are disabled by default. case "a", "b" -> 1; ^ (use --enable-preview to enable switch rules) 3 errors
3.2 Нам нужно включить функцию предварительного просмотра вручную:
javac --enable-preview --release 13 Example.java java --enable-preview Example
Рекомендации
- Проект OpenJDK 13
- ДЖЕП-354: Переключение выражений (Предварительный просмотр)
- Java 12 – Переключение выражений
- JEP 325: Переключение выражений
- JEP 305: Сопоставление шаблонов, например
- История версий Java
Оригинал: “https://mkyong.com/java/java-13-switch-expressions/”