Switch Expressions

Switch Expressions to usprawniona wersja instrukcji sterującej switch. Początkowo mechanizm ten został wprowadzony w Javie 12 jak tzw. preview feature, jednak później w Javie 13 i 14 przedstawiono pewne zmiany i poprawki. Switch Expressions są elementem projektu amber, który przewiduje także wprowadzenie innych zmian do Javy.

Przed Javą 12 instrukcja sterująca switch pozwalała na dokonanie wyboru pomiędzy wieloma wartościami typów całkowitoliczbowych, Stringami lub wartościami enum. Przykładowo:

Przed switch expression

String season = "Winter";
switch (season) {
    case "Spring":
        System.out.println("Mamy aktualnie wiosnę");
        break;
    case "Summer":
        System.out.println("Mamy aktualnie lato");
        break;
    case "Autumn":
        System.out.println("Mamy aktualnie jesień");
        break;
    case "Winter":
        System.out.println("Mamy aktualnie zimę");
        break;
    default:
        System.out.println("Nie znam takiej pory roku");
}

Przykład switch expression

Od Javy 12 możliwości switcha zostały poszerzone. Do tej pory w blokach case można było wykonać obliczenia, czy wywołać metodę. Od Javy 12 poszczególne bloki case mogą zwrócić wynik, który następnie można przypisać np. do zmiennej. Może to wyglądać np. tak:

String season = "Winter";
String translation = switch (season) {
    case "Spring":
        break "wiosna";
    case "Summer":
        break "lato";
    case "Autumn":
        break "jesień";
    case "Winter":
        break "zima";
    default:
        break "nieznany";
};

yield i break

W Javie 12 słowo break używane było teraz albo do zwracania wartości, albo do przerywania wybranego bloku case. Aby rozróżnić te dwie kwestie, od Javy 13 w przypadku zwracania wartości należy wykorzystać słowo yield:

String season = "Winter";
String translation = switch (season) {
    case "Spring":
        yield "wiosna";
    case "Summer":
        yield "lato";
    case "Autumn":
        yield "jesień";
    case "Winter":
        yield "zima";
    default:
        yield "nieznany";
};

Kurs Java

Operator strzałki (->)

Istnieje także możliwość wykorzystania alternatywnego zapisu z operatorem strzałki, podobnym do tego, który wykorzystywany jest w wyrażeniach lambda. Powyższy przykład można przerobić na taki:

String season = "Winter";
String translation = switch (season) {
    case "Spring" -> "wiosna";
    case "Summer" -> "lato";
    case "Autumn" -> "jesień";
    case "Winter" -> "zima";
    default -> "nieznany";
};

Tych dwóch typów zapisów tzn. wykorzystujących słowo yield i operator strzałki nie można ze sobą mieszać, tzn. nie można jednego bloku case zapisywać w jeden, a innego w inny sposób.

Kilka przypadków na raz

W jednym bloku case możesz obsłużyć kilka przypadków na raz:

String season = "Winter";
String temperature = switch (season) {
    case "Spring", "Summer" -> "ciepło";
    case "Autumn", "Winter" -> "zimno";
    default -> "nieznany";
};

W Javie 14 nie wprowadzano już żadnych zmian i switch expressions stały się pełnoprawną częścią języka. Nie wyklucza to jednak tego, że w kolejnych wersjach Javy nie zostaną do switcha wprowadzone dodatkowe usprawnienia - co więcej możemy być tego niemal pewni.

Dyskusja i komentarze

Masz pytania do tego wpisu? Może chcesz się podzieliś spostrzeżeniami? Zapraszamy dyskusji na naszej grupe na Facebooku.