Повторение — мать учения. Хотя ранее мы уже говорили о switch-е в Java, сегодня вспомним основное и разберем немного новой информации.
У Java есть 2 варианта switch — это switch statement и switch expression. Switch expression официально был в Java в версии 14, имея до этого 2 модификации в 12 и 13 версиях.
Но начнем сначала, вспомним как выглядит старый добрый свитч до версии 12:
public String getProductTypeByName(String product) {
String productType = "";
switch (product) {
case "Apple":
productType = "Fruit";
break;
case "Peach":
productType = "Fruit";
break;
case "Raspberry":
productType = "Berry";
break;
case "Cherry":
productType = "Berry";
break;
case "Tomato":
productType = "Vegetables";
break;
default:
productType = "other";
break;
}
return productType;
}
switch statement — это набор конструкций, которые будут выполняться друг за другом, не позволяя вернуть результат выполнения. Главная проблема использования switch statement заключается в том, что он позволяет добавлять бесконечное количество case выраженный, и этим часто злоупотребляют программисты.
В Java 12 его добавили как experimental feature, и уже не как switch statement, a как switch expression — новую версию свитча, которая дает возможность сохранять результат исполнения, использовать функциональный подход внутри и группировать значение в case выражениях, тем самым позволяя сделать его компактным.
Переписать метод getProductTypeByName() с использованием Java 12 можно так:
public String getProductTypeByName(String product) {
return switch (product) {
case "Apple", "Peach" -> "Fruit";
case "Raspberry", "Cherry" -> "Berry";
case "Tomato" -> "Vegetables";
default -> "other";
};
}
Теперь код выглядит более аккуратно. Использование arrow syntax из функционального программирования дает возможность возвращать значения без ключевого слова break, и вообще результат исполнения switch теперь можно сохранить в переменную или вернуть через return.
В случаях, когда нужно не только вернуть результат, но и иметь несколько строк кода, switch будет следующим:
public String getProductTypeByName(String product) {
var result = switch (product) {
case "Apple", "Peach" -> {
System.out.println("This is fruit");
break "Fruit";
}
case "Raspberry", "Cherry" -> {
System.out.println("This is a Berry");
break "Berry";
}
case "Tomato" -> {
System.out.println("This is a Vegetables");
break "Vegetables";
}
default -> {
break "other";
}
};
return result;
}
В Java 13 switch expression все еще находится в статусе experimental feature, и чтобы он был доступен для запуска, как и в Java 12, нужно использовать команду --enable-preview для компиляции и для запуска. Главная и в принципе единственная “обновка” switch в Java 13 — это ключевое слово yield, которое заменило break.
public String getProductTypeByName(String product) {
var result = switch (product) {
case "Apple", "Peach" -> {
System.out.println("This is fruit");
yield "Fruit";
}
case "Raspberry", "Cherry" -> {
System.out.println("This is a Berry");
yield "Berry";
}
case "Tomato" -> {
System.out.println("This is a Vegetables");
yield "Vegetables";
}
default -> {
System.out.println("Other");
yield "other";
}
};
return result;
}
Главным отличием yield от break является то, что break возвращал управление из case — команды, когда yield возвращает результат из целого switch, играя роль внутреннего return-a.
В Java 14 изменился оператор instanceOf, и теперь его можно использовать так:
if(o instanceof String s) {
s.toLowerCase();
}
Вместо старого и не очень красивого варианта, где кроме проверки на instanceOf нужно еще обязательно приводить переменную к определенному типу.
if(s instanceof String) {
((String) s).toLowerCase();
}
Эти изменения являются частью проекта Amber, цель которого — добавить в Java поддержку pattern matching.
Благодаря изменению оператора instanceOf в 14 версии и расширению в 16, Pattern Matching все-таки добавили в 17 версии. Правда пока только как preview, и протестировать его можно с помощью --enable-preview:
public String getObjectType(Object object) {
return switch (object) {
case Integer i -> "Integer";
case Long l -> "Long";
case String s -> "String";
default -> object.toString();
};
}
Вообще с каждой новой версией в языке появляется все больше и больше интересных фичей для разработки, что делает Java еще круче.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ