Vylepšený switch v Java 17
Nedávno jsem to psal do jedné FB diskuse a několika uživatelům se to líbilo. Pak ale autor vlákna celou diskusi najednou smazal. Tak jsem rozhodl sepsat to rovnou jako trvalý článek.
Java se postupně mění a podle mě se většinou mění k lepšímu. Jedním z příkladů vývoje v nejnovější LTS verzi Java 17 ze září 2021 evoluce příkazu switch
. Jako ukázkový příklad mám jednoduchý úkol - vezmi náhodné číslo 1-7 a vypiš počet písmen v anglickém názvu příslušného dne v týdnu.
Ve "staré" verzi switch
by to hlavní vypadalo třeba takto:
int numLetters = -1;
switch` (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
numLetters = 6;
break`;
case TUESDAY:
numLetters = 7;
break`;
case THURSDAY:
case SATURDAY:
numLetters = 8;
break`;
case WEDNESDAY:
numLetters = 9;
break`;
}
System.out.println("Pocet pismen: " + numLetters);
Vylepšený switch
umí dvě věci - spojit větve se stejnou obsluhou na jeden řádek s využtím nového symbolu ->
a tím ušetřit místo. Tedy např.:
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
Za ->
může následovat buďto jediný příkaz nebo blok kódu. Zároveň už není třeba psát klíčové slovo break
, aby kód nepropadl do další větve pod tím.
Druhá vymoženost je ještě zajímavější - switch
teď umí jako celek přímo vracet nějakou hodnotu. Kompilátoru se to sdělí tak, že začneme psát var variable = switch { … }
. Je třeba myslet na tři věci:
- Je-li kód větve v bloku, návratová hodnota se uvozuje klíčovým slovem
yield
- Návratové typy všech větví musí být všechny stejné
- Musí být pokryty všechny varianty vstupu (většinou řešitelné přes
default
)
Spojíme-li to vše dohromady, výsledkem je:
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
case -> {
System.out.println("Default vetev (ukazka s blokem kodu + yield)");
yield -1;
}
};
System.out.println("Pocet pismen: " + numLetters);
Za mě mnohem kratší, kompaktnější a hezčí.
Další odkazy
- Demo kód v rámci mých Java demos