Ответ
JDK 21 — это LTS-релиз, представляющий несколько завершенных и предварительных (preview) функций, меняющих подход к разработке на Java.
1. Виртуальные потоки (Virtual Threads) — JEP 444 (Завершена) Легковесные потоки, управляемые JVM, а не ОС. Позволяют писать синхронный блокирующий код, который масштабируется до миллионов параллельных задач.
// Запуск виртуального потока
Thread.startVirtualThread(() -> {
String result = downloadFromNetwork(); // Блокирующий вызов
System.out.println(result);
});
// Использование ExecutorService для виртуальных потоков
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 10_000).forEach(i ->
executor.submit(() -> {
Thread.sleep(Duration.ofSeconds(1));
return i;
})
);
}
2. Шаблоны записей (Record Patterns) — JEP 440 (Завершена)
Декомпозиция записей (records) в шаблонах instanceof и switch.
record Point(int x, int y) {}
// Декомпозиция в instanceof
if (obj instanceof Point(int x, int y)) {
System.out.println(x + y);
}
// Декомпозиция в switch
switch (shape) {
case Rectangle(Point(var x1, var y1), Point(var x2, var y2)) -> processRect(x1, y1, x2, y2);
case Circle(Point center, int radius) -> processCircle(center, radius);
}
3. Упорядоченные коллекции (Sequenced Collections) — JEP 431 (Завершена)
Новые интерфейсы (SequencedCollection, SequencedSet, SequencedMap) для коллекций с четким порядком обхода.
SequencedCollection<String> seq = new LinkedHashSet<>();
seq.addFirst("first"); // Добавить в начало
seq.addLast("last"); // Добавить в конец
String first = seq.getFirst(); // Получить первый элемент
4. Шаблоны строк (String Templates) — JEP 430 (Preview) Безопасная интерполяция строк с валидацией и экранированием.
String name = "Alice";
int age = 30;
// STR — шаблонный процессор
String message = STR."Hello, {name}. You are {age} years old.";
// FMT — процессор с форматированием
String formatted = FMT."Value: {value:%.2f}";
5. Поколенный ZGC (Generational ZGC) — JEP 439 (Завершена) Модификация сборщика мусора ZGC, разделяющая объекты на поколения (молодые/старые), что значительно снижает паузы и накладные расходы.
Эти изменения направлены на повышение производительности, масштабируемости и читаемости кода.