目录
2. 模式匹配增强(Pattern Matching for switch)
5. 序列化集合(Sequenced Collections)
Java 21 于 2023 年 9 月发布,是 Java 平台的一个长期支持(LTS)版本,引入了多项重要特性,旨在提升开发效率、代码可读性和性能。以下是 Java 21 的主要新特性及其具体应用,结合代码示例进行说明。所有示例均基于 Java 21 标准实现。
1. 虚拟线程(Virtual Threads)
虚拟线程是轻量级线程,由 JVM 管理,显著简化并发编程。它允许创建数千个线程而不消耗过多系统资源,适用于高并发场景如 Web 服务器或异步任务处理。
具体应用: 实现高并发任务,例如并行处理用户请求。
代码示例:
import java.util.concurrent.Executors;
public class VirtualThreadDemo {
public static void main(String[] args) {
// 创建虚拟线程执行任务
Thread.startVirtualThread(() -> {
System.out.println("虚拟线程运行中: " + Thread.currentThread());
});
// 使用 Executors 管理虚拟线程池
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
executor.submit(() -> System.out.println("任务1完成"));
executor.submit(() -> System.out.println("任务2完成"));
}
}
}
解释:
Thread.startVirtualThread()直接启动虚拟线程,无需手动管理线程池。Executors.newVirtualThreadPerTaskExecutor()创建基于虚拟线程的执行器,每个任务自动分配一个虚拟线程,提高资源利用率。- 应用场景:在微服务架构中处理 HTTP 请求,避免传统线程池的阻塞问题。
2. 模式匹配增强(Pattern Matching for switch)
模式匹配在 switch 语句中扩展,支持类型检查和值提取,减少冗余代码,提升代码简洁性。
具体应用: 简化对象类型处理,如解析不同数据类型。
代码示例:
public class PatternMatchingDemo {
public static void main(String[] args) {
Object obj = "Hello Java 21";
// 使用模式匹配 switch 处理不同类型
String result = switch (obj) {
case null -> "空对象";
case String s when s.length() > 5 -> "长字符串: " + s;
case String s -> "短字符串: " + s;
case Integer i -> "整数: " + i;
default -> "未知类型";
};
System.out.println(result); // 输出: 长字符串: Hello Java 21
}
}
解释:
case String s直接提取字符串值,when子句添加条件。- 无需显式
instanceof和强制类型转换,代码更清晰。 - 应用场景:在 API 网关中处理不同请求数据类型,提高代码可维护性。
3. 记录模式(Record Patterns)
记录模式允许在模式匹配中解构记录(record)对象,直接访问字段,简化数据操作。
具体应用: 处理不可变数据对象,如配置或 DTO。
代码示例:
record Point(int x, int y) {} // 定义记录类型
public class RecordPatternDemo {
public static void main(String[] args) {
Point point = new Point(10, 20);
// 使用记录模式解构 Point 对象
if (point instanceof Point(int x, int y)) {
System.out.println("坐标: (" + x + ", " + y + ")");
}
// 在 switch 中应用
Object obj = new Point(5, 5);
String desc = switch (obj) {
case Point(int a, int b) -> "点: (" + a + ", " + b + ")";
default -> "其他";
};
System.out.println(desc); // 输出: 点: (5, 5)
}
}
解释:
Point(int x, int y)直接解构记录字段,无需调用 getter 方法。- 结合模式匹配,增强代码表达力。
- 应用场景:在数据解析库中处理 JSON 或 XML 结构,减少样板代码。
4. 字符串模板(String Templates)
字符串模板提供安全、可读的字符串插值,支持自定义模板处理器,防止 SQL 注入等安全问题。
具体应用: 构建动态字符串,如 SQL 查询或日志消息。
代码示例:
import java.lang.StringTemplate;
public class StringTemplateDemo {
public static void main(String[] args) {
String name = "Java";
int version = 21;
// 使用 STR 模板处理器
String message = STR."欢迎使用 \{name} \{version}";
System.out.println(message); // 输出: 欢迎使用 Java 21
// 自定义模板处理器(示例:简单转义)
StringTemplate.Processor<String, RuntimeException> ESCAPE = st -> {
String result = st.interpolate();
return result.replace("<", "<"); // 防止 XSS 攻击
};
String safeHtml = ESCAPE."<script>alert('\{"恶意代码"}')</script>";
System.out.println(safeHtml); // 输出: <script>alert('恶意代码')</script>
}
}
解释:
STR."...\{variable}..."语法插入变量,STR是内置处理器。- 自定义处理器如
ESCAPE可添加安全逻辑,避免注入风险。 - 应用场景:在 Web 应用中构建用户输入字符串,提升安全性。
5. 序列化集合(Sequenced Collections)
引入新接口如 SequencedCollection,为集合提供统一的首尾元素操作方法,解决传统集合 API 的不足。
具体应用: 有序集合操作,如队列或栈管理。
代码示例:
import java.util.LinkedList;
import java.util.SequencedCollection;
public class SequencedCollectionDemo {
public static void main(String[] args) {
SequencedCollection<String> list = new LinkedList<>();
list.add("第一");
list.add("第二");
// 新增方法:首尾操作
list.addFirst("首元素");
list.addLast("尾元素");
System.out.println(list); // 输出: [首元素, 第一, 第二, 尾元素]
System.out.println("首元素: " + list.getFirst()); // 输出: 首元素
System.out.println("尾元素: " + list.getLast()); // 输出: 尾元素
}
}
解释:
SequencedCollection提供addFirst(),getLast()等方法,统一List,Deque的行为。- 简化有序数据结构的代码,避免使用多个接口。
- 应用场景:在缓存系统管理 FIFO/LIFO 队列,提高代码一致性。
总结
Java 21 通过虚拟线程提升并发性能、模式匹配和记录模式增强代码可读性、字符串模板保障安全性、序列化集合统一 API。这些特性使 Java 更适应现代开发需求,如云原生应用和大规模系统。建议开发者升级到 Java 21 LTS 以利用这些优势。实际应用中,结合 IDE 如 IntelliJ IDEA 进行测试,确保兼容性。
8万+

被折叠的 条评论
为什么被折叠?



