switch.Pattern Matching в
switch — убийца if-else цепочек ⚔️Ты наверняка видел такие простыни:
if (obj instanceof String) {
System.out.println("Строка длиной " + ((String) obj).length());
} else if (obj instanceof Integer) {
System.out.println("Целое число " + obj);
} else if (obj instanceof List) {
System.out.println("Список размером " + ((List<?>) obj).size());
} else {
System.out.println("Неизвестный тип");
}
Знакомо? 😅
Тут и дублирование, и касты, и вечная путаница.
Что пришло с Java 17+ 🌟
Теперь можно использовать Pattern Matching прямо в
switch:
switch (obj) {
case String s -> System.out.println("Строка длиной " + s.length());
case Integer i -> System.out.println("Целое число " + i);
case List<?> l -> System.out.println("Список размером " + l.size());
default -> System.out.println("Неизвестный тип");
}
Красота:
✅ Нет ручных кастов
✅ Нет
else if простыней✅ Всё читается как декларативное описание
А если хочется добавить условия? 🤔
Можно так:
switch (obj) {
case String s when s.length() > 5 ->
System.out.println("Длинная строка");
case String s ->
System.out.println("Короткая строка");
default ->
System.out.println("Что-то другое");
}
Тут
when — это guard condition.Оно проверяется после совпадения типа, и только тогда срабатывает ветка.
Сравним 🥊
До Java 17: каша из
if-else, ручные касты.После Java 17: один чистый
switch, никакой боли.Итог 💡
- Используй
switch с pattern matching, когда у тебя много разных подтипов или вход может быть разным типом.- Код становится декларативным и компактным.
- А главное — исчезают дубли и лишние касты.
👉 @BookJava