# Java代码现代化改造 `Java` `代码重构` `现代化` `Stream` `虚拟线程` `Record` # modern-java > 你的 `build.gradle` 写着 Java 21,你的代码却还停在 2011 年。 > 一个技能,让你的整个代码库自动追上时代。 **modern-java** 扫描你的 Java 项目,检测过时的代码模式,并将其转换为现代惯用写法——版本感知、框架智能、零配置。它读取你的构建文件,只加载与你 Java 版本相关的内容,并精确展示变更内容及原因。 ```bash 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` | `ScopedValue` | 25 | | `HttpURLConnection` | `HttpClient` | 11 | | 多行字符串拼接 | 文本块 | 15 | --- ## 实际示例 ### DTO / POJO → Record(Java 16+) 这段代码你写过一次,之后又写了一千次。 **改造前** — 45 行,全是样板代码: ```java // 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 行,同样的保证: ```java // 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 个并发订单: ```java // OrderProcessingService.java public class OrderProcessingService { // 最多 100 个并发订单 — OS 线程代价高昂 private final ExecutorService executor = Executors.newFixedThreadPool(100); public void processOrders(List orders) { for (Order order : orders) { executor.submit(() -> { fetchInventory(order); // I/O:~50ms 阻塞线程 chargePayment(order); // I/O:~80ms 阻塞线程 sendConfirmation(order); // I/O:~30ms 阻塞线程 }); } } } ``` **改造后** — 每个任务一个虚拟线程,支持数百万并发订单: ```java // OrderProcessingService.java public class OrderProcessingService { public void processOrders(List orders) { // 虚拟线程在 I/O 时挂起,而不是阻塞 OS 线程 try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { orders.forEach(order -> executor.submit(() -> { fetchInventory(order); // 挂起,释放载体线程 chargePayment(order); // 挂起,释放载体线程 sendConfirmation(order); // 挂起,释放载体线程 }) ); } // 结构化:等待所有任务完成后自动关闭 } } ``` > **效果:** 代码结构相同、异常处理相同、阻塞式可读性相同—— > 但现在你的服务能以极少的内存处理 10,000+ 个并发订单。 --- ## 工作原理 1. **检测 Java 版本** — 从 `pom.xml`、`build.gradle` 或 `gradle/libs.versions.toml` 中读取 2. **仅加载相关特性** — Java 8 项目?不会出现虚拟线程建议 3. **检测框架**(Spring Boot、Quarkus、Micronaut)以提供框架专属建议 4. **扫描 `.java` 文件** — 使用版本匹配的检测规则识别旧式模式 5. **展示改造前后对比** — 每项转换均附带所需的最低 Java 版本 6. **生成现代化报告** — 包含已修改文件、节省行数、发现的模式 ``` ## 现代化报告 项目版本: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,响应式运行时集成 --- ## 安装 ```bash npx skills@1.4.1 add ajaywadhara/modern-java ``` 或将 `SKILL.md` 放置于项目根目录,并通过 AI 智能体加载。 **兼容:** Claude Code、Cursor、Cline 及任何支持 [Agent Skills](https://skills.sh) 标准的智能体。 > `skills` CLI 由 [vercel-labs/skills](https://github.com/vercel-labs/skills) 发布。 > 固定使用 `@1.4.1` 可确保运行经过验证的版本。 --- ## 安全性 本技能**仅包含 Markdown 和 Java 代码示例** — 无可执行脚本、无网络调用、无依赖项、不收集任何数据。 - **读取范围:** 扫描当前项目中的 `.java` 文件和构建描述文件(`pom.xml`、`build.gradle`、`*.toml`) - **写入范围:** 建议转换方案;仅在你确认后才执行应用 - **无外部调用:** 技能本身不发起任何网络请求 - **不访问密钥:** 不读取环境变量、凭证或系统文件 已通过 [Agent Trust Hub](https://skills.sh/audits) · [Socket](https://socket.dev) · [Snyk](https://snyk.io) 审计 --- ## 兼容性说明 - 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](https://skills.sh) 开放标准构建。版本感知范围覆盖 Java 8 至 25。*