Шаблоны в switch
Сочетайте запечатанные типы и шаблоны
«Шаблоны в switch» — бесплатный урок Java Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Шаблоны в операторе выбора
Оператор выбора прошёл путь от сопоставления констант к сопоставлению шаблонов. В сочетании с типами с ограниченной иерархией и записями он может выбирать действие по типу, деструктурировать данные и гарантировать полноту обработки.
Шаблоны типов в операторе выбора
Каждая ветвь может содержать шаблон типа, связывающий типизированную переменную для этой ветви.
public class Main {
static String kind(Object o) {
return switch (o) {
case Integer i -> "int " + i;
case String s -> "string " + s;
default -> "other";
};
}
public static void main(String[] args) {
System.out.println(kind(42));
System.out.println(kind("hi"));
System.out.println(kind(3.14));
}
}Типам с ограниченной иерархией не нужен вариант по умолчанию
Если селектор имеет тип с ограниченной иерархией и Вы охватили все разрешённые подтипы, оператор выбора является исчерпывающим и не требует default.
public class Main {
sealed interface Shape permits Circle, Square {}
record Circle(double r) implements Shape {}
record Square(double s) implements Shape {}
static double area(Shape shape) {
return switch (shape) {
case Circle c -> Math.PI * c.r() * c.r();
case Square sq -> sq.s() * sq.s();
};
}
public static void main(String[] args) {
System.out.printf("%.2f%n", area(new Square(3)));
}
}Шаблоны записей в ветвях
Ветви могут деструктурировать записи, предоставляя их компоненты непосредственно в теле ветви.
public class Main {
sealed interface Shape permits Circle, Rectangle {}
record Circle(double r) implements Shape {}
record Rectangle(double w, double h) implements Shape {}
static double area(Shape shape) {
return switch (shape) {
case Circle(double r) -> Math.PI * r * r;
case Rectangle(double w, double h) -> w * h;
};
}
public static void main(String[] args) {
System.out.printf("%.2f%n", area(new Rectangle(2, 5)));
}
}Условия для ветвей
Условие when добавляет логическую проверку к ветви. Ветвь срабатывает только тогда, когда шаблон подходит и условие истинно.
public class Main {
static String size(Object o) {
return switch (o) {
case Integer i when i < 0 -> "negative";
case Integer i when i == 0 -> "zero";
case Integer i -> "positive";
default -> "not an int";
};
}
public static void main(String[] args) {
System.out.println(size(-5));
System.out.println(size(0));
System.out.println(size(7));
}
}Порядок ветвей с условиями важен
Ветви с условиями проверяются сверху вниз. Более конкретная ветвь с условием должна находиться перед более общей ветвью без условия, иначе общая ветвь перехватит соответствующее значение.
Обработка значения null
Добавьте case null, чтобы обработать селектор со значением null; в противном случае оператор выбора выбросит NullPointerException. Можно даже объединить этот вариант с вариантом по умолчанию: case null, default.
public class Main {
static String label(String s) {
return switch (s) {
case null -> "missing";
case "yes" -> "affirmative";
default -> "other: " + s;
};
}
public static void main(String[] args) {
System.out.println(label(null));
System.out.println(label("yes"));
System.out.println(label("maybe"));
}
}Вложенные шаблоны в операторе выбора
Ветви могут содержать вложенные шаблоны записей, чтобы сопоставлять глубокие структуры и проверять внутренние значения в одном месте.
public class Main {
record Point(int x, int y) {}
record Line(Point a, Point b) {}
static String describe(Object o) {
return switch (o) {
case Line(Point(var x1, var y1), Point(var x2, var y2)) when x1 == x2 -> "vertical";
case Line(Point a, Point b) -> "line";
default -> "other";
};
}
public static void main(String[] args) {
System.out.println(describe(new Line(new Point(1, 0), new Point(1, 5))));
System.out.println(describe(new Line(new Point(0, 0), new Point(2, 3))));
}
}Инструкции и выражения
Оператор выбора с шаблонами работает и как выражение (возвращая значение с помощью -> или yield), и как инструкция. Для запечатанных селекторов действуют правила полноты обработки.
Замена кода обходчика
Вместе типы с ограниченной иерархией и оператор выбора с шаблонами заменяют громоздкие шаблоны обходчиков и длинные цепочки проверок типов компактным выбором действий по закрытой модели, который проверяется компилятором.
Полный интерпретатор
Вычислитель выражений, использующий модель с ограниченной иерархией и оператор выбора с шаблонами.
public class Main {
sealed interface Expr permits Num, Add, Mul {}
record Num(int value) implements Expr {}
record Add(Expr left, Expr right) implements Expr {}
record Mul(Expr left, Expr right) implements Expr {}
static int eval(Expr e) {
return switch (e) {
case Num(int v) -> v;
case Add(Expr l, Expr r) -> eval(l) + eval(r);
case Mul(Expr l, Expr r) -> eval(l) * eval(r);
};
}
public static void main(String[] args) {
Expr e = new Add(new Num(2), new Mul(new Num(3), new Num(4)));
System.out.println(eval(e));
}
}Быстрая проверка
Проверьте, насколько хорошо Вы поняли шаблоны в операторе выбора.
Итоги
Вы изучили шаблоны в операторе выбора.
- Ветви могут содержать шаблоны типов и шаблоны записей с деструктуризацией.
- Селекторы с ограниченной иерархией позволяют создавать исчерпывающие операторы выбора без
default. - Условия
whenуточняют ветви; порядок имеет значение. case nullбезопасно обрабатывает значение null.
Часто задаваемые вопросы
Урок «Шаблоны в switch» бесплатный?
Да — полный текст урока «Шаблоны в switch» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Шаблоны в switch»?
Сочетайте запечатанные типы и шаблоны Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Шаблоны в switch»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.