Статьи

JDK 14 — Выключение выражений JEP 361 из предварительного просмотра

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