Примечание. Чтобы использовать Switch Expressions, вам потребуется как минимум Java 14.

Я не хочу тратить ваше время на разговоры о том, насколько круты новые Switch Expressions. Вместо этого я попытаюсь объяснить, как использовать новый расширенный переключатель.

Знакомство со списками констант case в switch

Прежде чем объяснять, что такое список case-констант, давайте попробуем написать традиционный переключатель для простого case.

public class SwitchForMedium {
    public static void main(String[] args) {
        String result = traditionalSwitch("Bart Simpson");
        System.out.println(result);
    }
static String traditionalSwitch(String name) {
        String result;
        switch (name) {
            case "Lisa Simpson":
                result = "Nice girl!";
                break;
            case "Bart Simpson":
            case "Mr Burns":
            case "Nelson Muntz":
                result = "Grade A badass";
                break;
            case "Homer Simpson":
                result = "Meh";
                break;
            case "Marge Simpson":
                result = "A Caring Mom";
                break;
            case "Maggie Simpson":
                result = "Too young to decide!";
                break;
            default:
                result = "I have no idea!";
        }
        return name + " : " + result;
    }
}

Теперь, если вы заметили, от случая 2 до случая 4 (от Барта Симпсона до Нельсона Мунца), результат будет таким же. Итак, зачем вводить ключевое слово case трижды, если можно использовать новые списки констант case. Вот как это выглядит!

static String switchWithCaseConstantLists(String name) {
    String result;
    switch (name) {
        case "Lisa Simpson":
            result = "Nice girl!";
            break;
        case "Bart Simpson", "Mr Burns", "Nelson Muntz":
            result = "Grade A badass";
            break;
        case "Homer Simpson":
            result = "Meh";
            break;
        case "Marge Simpson":
            result = "A Caring Mom";
            break;
        case "Maggie Simpson":
            result = "Too young to decide!";
            break;
        default:
            result = "I have no idea!";
    }
    return name + " : " + result;
}

Переход к выражениям Switch

До сих пор мы видели, как можно улучшить традиционный переключатель. Теперь давайте попробуем понять, что такое switch Expression.

Прежде чем вы увидите какой-либо код, yield — это одно новое ключевое слово, о котором вы, возможно, захотите узнать. Проще говоря, yield служит как оператор break, но это гораздо больше. Мы поговорим об этом после просмотра кода.

int a = 10 + 20;

К вашему сведению, приведенное выше утверждение также является выражением.

Выражение переключения выглядит примерно так:

static String switchExpression(String name) {
    String result = switch (name) {
        case "Lisa Simpson":
            yield "Nice girl!";
        case "Bart Simpson", "Mr Burns", "Nelson Muntz":
            yield "Grade A badass";
        case "Homer Simpson":
            yield "Meh";
        case "Marge Simpson":
            yield "A Caring Mom";
        case "Maggie Simpson":
            yield "Too young to decide!";
        default:
            yield "I have no idea!";
    };

    return name + " : " + result;
}

Таким образом, по существу, yield служит разрывом, а также производит значение оператора switch. yield также обеспечивает завершение коммутатора и в некотором роде предотвращает подводные камни. (Подводные камни в случае переключения возникают, когда разработчик забывает включить break после каждого case)

Теперь давайте попробуем взломать приведенный выше код. Попробуйте удалить случай default и вызвать метод с name, не найденным ни в одном из случаев переключения.

static String switchExpression(String name) {
    String result = switch (name) {
        case "Lisa Simpson":
            yield "Nice girl!";
        case "Bart Simpson", "Mr Burns", "Nelson Muntz":
            yield "Grade A badass";
        case "Homer Simpson":
            yield "Meh";
        case "Marge Simpson":
            yield "A Caring Mom";
        case "Maggie Simpson":
            yield "Too young to decide!";
    };

    return name + " : " + result;
}

Вы можете увидеть что-то подобное во время выполнения, когда запустите следующее!

switchExpression(“SomeName”);
error: the switch expression does not cover all possible input values
 String result = switch (name) {
 ^

Можете ли вы догадаться, почему? Ага! Вы правильно угадали. Внутри переключателя нет значения для отката, поэтому выражение не может быть разрешено. Отсюда и ошибка времени выполнения! На самом деле, даже если вы не вызываете описанный выше метод, если вы запустите код, вы можете увидеть ошибку.

Важно запомнить: при использовании выражения switch операторы case должны обрабатывать все возможные значения. Если нет, то вылетает ошибка!

Теперь перейдем к моей любимой части новых выражений переключения.

Представляем Switch со стрелками

Устали от использования переключателя двоеточия :inside? Что ж, -> на помощь. Давайте посмотрим на код, а затем поговорим о нескольких правилах, которым нужно следовать при использовании операторов со стрелкой.

static String switchExpressionWithArrowCasedStatements(String name) {
    String result = switch (name) {
        case "Lisa Simpson" -> "Nice girl!";
        case "Bart Simpson", "Mr Burns", "Nelson Muntz" -> "Grade A badass";
        case "Homer Simpson" -> "Meh";
        case "Marge Simpson" -> "A Caring Mom";
        case "Maggie Simpson" -> "Too young to decide!";
        default -> "I have no idea!";
    };

    return name + " : " + result;

Итак, что изменилось? Вверху мы просто заменили двоеточие:после ключевого слова case на стрелку->.

Затем мы удалили оператор yield. Да! Время для правила 1.

Вы не должны использовать yield с операторами со стрелкой, по крайней мере, не с выражениями операторов со стрелкой!

Теперь давайте попробуем сломать код.

static String switchExpressionWithArrowCasedStatements2(String name) {
    String result = switch (name) {
        case "Lisa Simpson" -> "Nice girl!";
        case "Bart Simpson", "Mr Burns", "Nelson Muntz" -> "Grade A badass";
        case "Homer Simpson" -> "Meh";
        case "Marge Simpson" -> "A Caring Mom";
        case "Maggie Simpson" : "Too young to decide!";
        default -> "I have no idea!";
    };

    return name + " : " + result;
}

Если вы заметили, для случая Maggie Simpson я попытался использовать оператор с двоеточием. Приведенный выше код не будет компилироваться. Время для правила 2.

Вы не можете смешивать : операторы с регистром и -> операторы с регистром!

Теперь в приведенном выше коде мы видели выражения с -> операторами в регистре. Точно так же мы можем использовать блок с -> операторами в регистре. Это может выглядеть примерно так:

static String switchExpressionWithArrowCasedStatementsAndBlocks(String name) {
    String result = switch (name) {
        case "Lisa Simpson" -> {
            System.out.println("I am cool!");
            yield "Nice girl!";
        }
        case "Bart Simpson", "Mr Burns", "Nelson Muntz" -> {
            System.out.println("You can put a block of code here! Go crazy! Well, you really shouldn't! ");
            yield "Grade A badass";
        }
        case "Homer Simpson" -> "Meh";
        case "Marge Simpson" -> "A Caring Mom";
        case "Maggie Simpson" -> "Too young to decide!";
        default -> "I have no idea!";
    };

    return name + " : " + result;
}

Время для правила 3! Когда оператор с регистром -> используется с блоком кода, всегда следите за тем, чтобы выражение switch имело значение yield.

Последнее правило: Вы не можете использовать оператор break с операторами -> в регистре.

Вам не кажется, что новые выражения переключения круты? Если вы спросите меня, я просто люблю их. Надеюсь, вы получили удовольствие от чтения и не стесняйтесь предлагать какие-либо улучшения!