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

undefined
9
Задача
Java Core, 7 уровень, 2 лекция
Недоступна
Заметки
Асинхронность выполнения нитей. 1. Класс Note будет использоваться нитями. 2. Создай public static нить NoteThread (Runnable не является нитью), которая в методе run 1000 раз (index = 0-999) сделает следующие действия: 2.1. Используя метод addNote добавит заметку с именем [getName() + "-Note" + inde
undefined
5
Задача
Java Core, 7 уровень, 2 лекция
Недоступна
Вместе быстрее? Ща проверим :)
1. Разберись, что и как работает. 2. Создай public static нить SortThread, которая в методе run отсортирует статический массив testArray используя метод sort.