Что нового в Java 21
Java 21 — это LTS-релиз (Long Term Support), который принёс множество важных нововведений. Рассмотрим ключевые фичи.
Virtual Threads (Project Loom)
Virtual threads — лёгкие потоки, управляемые JVM, а не ОС. Они позволяют создавать миллионы потоков без критического потребления памяти.
1// Создание виртуального потока2Thread.startVirtualThread(() -> {3 System.out.println("Virtual thread: " + Thread.currentThread().getName());4});56// Использование с ExecutorService7try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {8 IntStream.range(0, 100_000).forEach(i -> {9 executor.submit(() -> {10 Thread.sleep(Duration.ofSeconds(1));11 return i;12 });13 });14}1516// Structured Task ScopedValue17ScopedValue<User> currentUser = ScopedValue.newInstance();1819ScopedValue.where(currentUser, user).run(() -> {20 // Доступ к currentUser из любого места в этом scope21 handleRequest();22});
▸Когда использовать virtual threads
▸Когда НЕ использовать
Pattern Matching
▸for switch
1// До Java 212String result;3if (obj instanceof String s) {4 result = s.toUpperCase();5} else if (obj instanceof Integer i) {6 result = String.valueOf(i * 2);7} else {8 result = "unknown";9}1011// Java 21+12String result = switch (obj) {13 case String s -> s.toUpperCase();14 case Integer i -> String.valueOf(i * 2);15 case null -> "null";16 default -> "unknown";17};
▸Guarded Patterns
1static String format(Object obj) {2 return switch (obj) {3 case Integer i && i > 0 -> "Positive integer: " + i;4 case Integer i -> "Non-positive integer: " + i;5 case String s && s.length() > 10 -> "Long string: " + s.substring(0, 10) + "...";6 case String s -> "String: " + s;7 case null -> "null";8 default -> "Other: " + obj.getClass().getSimpleName();9 };10}
Record Patterns
1record Point(int x, int y) {}2record Line(Point start, Point end) {}34// Деструктуризация records5static double distance(Object obj) {6 return switch (obj) {7 case Point(int x, int y) -> Math.sqrt(x * x + y * y);8 case Line(Point(int x1, int y1), Point(int x2, int y2)) ->9 Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));10 default -> 0;11 };12}
Sealed Classes
1// Ограничение иерархии наследования2public sealed class Shape permits Circle, Rectangle, Triangle {3}45public final class Circle extends Shape {6 double radius;7}89public final class Rectangle extends Shape {10 double width, height;11}1213public non-sealed class Triangle extends Shape {14 // Может быть расширена15}
Sequenced Collections
Новый интерфейс для коллекций с определённым порядком:
1SequencedCollection<String> list = new ArrayList<>(List.of("a", "b", "c"));23// Доступ к первому/последнему элементу4String first = list.getFirst();5String last = list.getLast();67// Добавление в начало/конец8list.addFirst("z");9list.addLast("d");1011// Reversed view12SequencedCollection<String> reversed = list.reversed();
Unnamed Classes и Instance Main Methods
1// Unnamed класс — больше не нужен public class2void main() {3 System.out.println("Hello from unnamed class!");4}
Key Permutations
1// Ранее это была ошибка, теперь это работает2switch (key) {3 case "Hello", "world" -> System.out.println("Greetings!");4 case 1, 2, 3 -> System.out.println("Small number");5 case null -> System.out.println("null key");6}
Другие улучшения
▸String Templates
1String name = "World";2String greeting = STR."Hello, {name}!"; // Java 21 preview
###Unnamed Variables
1// Переменные, которые не используются2if (obj instanceof Point(_, int y)) {3 System.out.println("y coordinate: " + y);4}56for (var entry : map.entrySet()) {7 var key = entry.getKey();8 var _ = entry.getValue(); // unnamed9 process(key);10}
Миграция на Java 21
▸Shifting Default
▸Рекомендации
Начните с virtual threads для I/O-bound сервисов
Используйте pattern matching для упрощения if-else цепочек
Применяйте record patterns для деструктуризации
Рассмотрите sealed classes для control flow
Заключение
Java 21 знаменует собой значительный шаг вперёд для языка. Virtual threads решают давнюю проблему масштабирования, pattern matching делает код более выразительным, а новые коллекции упрощают работу с данными. Для собеседования важно знать хотя бы основы этих нововведений и понимать, когда их применять.