switch expression

Открыта

Повторение — мать учения. Хотя ранее мы уже говорили о 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 еще круче.

9
Задача
Java Core,  7 уровень,  2 лекция
Недоступна
Заметки
Заметки
5
Задача
Java Core,  7 уровень,  2 лекция
Недоступна
Вместе быстрее? Ща проверим :)
Вместе быстрее? Ща проверим :)
Комментарии (12)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
24 сентября 2025, 18:00
Усложняем switch expression - интересная задача. Сделал, всё красиво выводит согласно условия, но валидатор не принимал решение. Часа два провозился и так и эдак - не получается. Воспользовался подсказкой. Разобрал решение предложенное валидатором и не пожалел. Интересные выводы для себя сделал.🧐
rwnmei
Уровень 1
11 марта 2025, 10:16
Больше тупил не над самой задачей а над тем как работает этот код но зато когда понял что куда и где берется стало легко сначала подумал нужен цикл но он и так есть получается просто в артикле посчитать кол во а в стриме это ваще делается на изи
Михаил
Уровень 50
3 октября 2024, 03:37
странно сформулировано последнее
Александр
Уровень 39
Expert
14 декабря 2023, 22:57
tomato это ягода
Misha Saharin
Уровень 111
Expert
2 марта 2023, 09:07
Dmitry Parfenov
Уровень 108
Expert
19 августа 2022, 12:17
case MONDAY, FRIDAY, SUNDAY -> "\bшесть("+6;
Вот такого плана вариант во второй задачке не прокатывает. Но все условия вроде бы соблюдены =)
Евгений Frontend Developer
3 сентября 2022, 17:53
Такое прокатывает)
case MONDAY, FRIDAY, SUNDAY -> {
    System.out.print("шесть");
    yield 6;
}
Андрей
Уровень 48
22 ноября 2022, 22:37
там же пример сверху, зачем городить велосипед (это я к Дмитрию). Все намного проще
Abilkair Bolatbayev
Уровень 76
28 июля 2022, 09:05
"Вообще с каждой новой версией в языке появляется все больше и больше интересных фичей для разработки, что делает Java еще круче." Все больше слышу что все больше клиентов переходят на Go. Что скажете?
Abilkair Bolatbayev
Уровень 76
28 июля 2022, 08:06
2 + 2 - 2 = 4, все согласны?
Greg
Уровень 108
Expert
3 октября 2022, 12:19
4 цифры получили.
Эдуард System Engineer Expert
18 апреля 2022, 18:32
Project -> Settings -> Java Compiler -> select ByteCode version to 17