7.4 KiB
7.4 KiB
Java代码现代化改造
Java 代码重构 现代化 Stream 虚拟线程 Record
modern-java
你的
build.gradle写着 Java 21,你的代码却还停在 2011 年。 一个技能,让你的整个代码库自动追上时代。
modern-java 扫描你的 Java 项目,检测过时的代码模式,并将其转换为现代惯用写法——版本感知、框架智能、零配置。它读取你的构建文件,只加载与你 Java 版本相关的内容,并精确展示变更内容及原因。
npx skills@1.4.1 add ajaywadhara/modern-java
功能说明
| 旧式写法 | 现代替代方案 | 起始版本 |
|---|---|---|
带过滤/映射的 for 循环 |
Stream API | 8 |
| 匿名内部类 | Lambda 表达式 | 8 |
null 链式检查 |
Optional |
8 |
| 50 行 POJO / DTO | record |
16 |
if (x instanceof Foo) { Foo f = (Foo) x; } |
模式匹配 instanceof |
16 |
带 break 的 switch |
带 -> 的 Switch 表达式 |
14 |
Executors.newFixedThreadPool(N) |
虚拟线程 | 21 |
ThreadLocal<T> |
ScopedValue<T> |
25 |
HttpURLConnection |
HttpClient |
11 |
| 多行字符串拼接 | 文本块 | 15 |
实际示例
DTO / POJO → Record(Java 16+)
这段代码你写过一次,之后又写了一千次。
改造前 — 45 行,全是样板代码:
// UserResponse.java
public class UserResponse {
private final Long id;
private final String email;
private final String role;
private final LocalDateTime createdAt;
public UserResponse(Long id, String email, String role, LocalDateTime createdAt) {
this.id = id;
this.email = email;
this.role = role;
this.createdAt = createdAt;
}
public Long getId() { return id; }
public String getEmail() { return email; }
public String getRole() { return role; }
public LocalDateTime getCreatedAt() { return createdAt; }
@Override public boolean equals(Object o) { /* 10 行 */ }
@Override public int hashCode() { /* 5 行 */ }
@Override public String toString() { /* 5 行 */ }
}
改造后 — 1 行,同样的保证:
// UserResponse.java
public record UserResponse(Long id, String email, String role, LocalDateTime createdAt) {}
- 默认不可变
- 自动生成
equals、hashCode、toString - 兼容 Spring 的
@ConstructorBinding、Jackson 和 Quarkus Panache(适用于 DTO,非实体类)
平台线程 → 虚拟线程(Java 21+)
旧方式受限于线程池大小,新方式可扩展至数百万并发。
改造前 — 100 个线程,最多 100 个并发订单:
// OrderProcessingService.java
public class OrderProcessingService {
// 最多 100 个并发订单 — OS 线程代价高昂
private final ExecutorService executor =
Executors.newFixedThreadPool(100);
public void processOrders(List<Order> orders) {
for (Order order : orders) {
executor.submit(() -> {
fetchInventory(order); // I/O:~50ms 阻塞线程
chargePayment(order); // I/O:~80ms 阻塞线程
sendConfirmation(order); // I/O:~30ms 阻塞线程
});
}
}
}
改造后 — 每个任务一个虚拟线程,支持数百万并发订单:
// OrderProcessingService.java
public class OrderProcessingService {
public void processOrders(List<Order> orders) {
// 虚拟线程在 I/O 时挂起,而不是阻塞 OS 线程
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
orders.forEach(order ->
executor.submit(() -> {
fetchInventory(order); // 挂起,释放载体线程
chargePayment(order); // 挂起,释放载体线程
sendConfirmation(order); // 挂起,释放载体线程
})
);
} // 结构化:等待所有任务完成后自动关闭
}
}
效果: 代码结构相同、异常处理相同、阻塞式可读性相同—— 但现在你的服务能以极少的内存处理 10,000+ 个并发订单。
工作原理
- 检测 Java 版本 — 从
pom.xml、build.gradle或gradle/libs.versions.toml中读取 - 仅加载相关特性 — Java 8 项目?不会出现虚拟线程建议
- 检测框架(Spring Boot、Quarkus、Micronaut)以提供框架专属建议
- 扫描
.java文件 — 使用版本匹配的检测规则识别旧式模式 - 展示改造前后对比 — 每项转换均附带所需的最低 Java 版本
- 生成现代化报告 — 包含已修改文件、节省行数、发现的模式
## 现代化报告
项目版本:Java 21
扫描文件数:47
发现模式数:23
节省行数:~320(14%)
| 文件 | 模式 | 节省行数 |
|-------------------------|--------------------|-------------|
| UserResponse.java | DTO → Record | −44 |
| OrderService.java | for 循环 → Stream | −12 |
| ApiClient.java | HttpURLConnection | −28 |
| TaskExecutor.java | 平台 → 虚拟线程 | −8 |
支持的版本与框架
| Java 版本 | 加载的特性 |
|---|---|
| 8–11 | Lambda、Stream、Optional、CompletableFuture、var、HttpClient |
| 12–17 | Switch 表达式、文本块、Record、模式匹配、密封类 |
| 18–21 | 虚拟线程、模式匹配 Switch、Record 模式、有序集合 |
| 22–25 | 未命名变量、Stream Gatherers、ScopedValue、灵活构造函数、紧凑源文件 |
框架感知转换:
- Spring Boot — 用
RestClient替代RestTemplate,Record 配合@ConstructorBinding,虚拟线程自动配置 - Quarkus — Panache 感知(Record 用于 DTO,非实体),RESTEasy 虚拟线程支持
- Micronaut — 值对象使用 Record,响应式运行时集成
安装
npx skills@1.4.1 add ajaywadhara/modern-java
或将 SKILL.md 放置于项目根目录,并通过 AI 智能体加载。
兼容: Claude Code、Cursor、Cline 及任何支持 Agent Skills 标准的智能体。
skillsCLI 由 vercel-labs/skills 发布。 固定使用@1.4.1可确保运行经过验证的版本。
安全性
本技能仅包含 Markdown 和 Java 代码示例 — 无可执行脚本、无网络调用、无依赖项、不收集任何数据。
- 读取范围: 扫描当前项目中的
.java文件和构建描述文件(pom.xml、build.gradle、*.toml) - 写入范围: 建议转换方案;仅在你确认后才执行应用
- 无外部调用: 技能本身不发起任何网络请求
- 不访问密钥: 不读取环境变量、凭证或系统文件
已通过 Agent Trust Hub · Socket · Snyk 审计
兼容性说明
- Record 需要 Java 16+(14-15 为预览版)
- 虚拟线程需要 Java 21+(19-20 为预览版)
- 密封类需要 Java 17+(15-16 为预览版)
- 模式匹配 Switch 需要 Java 21+(17-20 为预览版)
String templates(STR."...")—— Java 23 中已撤回,不推荐使用
基于 Agent Skills 开放标准构建。版本感知范围覆盖 Java 8 至 25。