catalog/repos/ajaywadhara--modern-java.md

7.4 KiB
Raw Permalink Blame History

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
breakswitch -> 的 Switch 表达式 14
Executors.newFixedThreadPool(N) 虚拟线程 21
ThreadLocal<T> ScopedValue<T> 25
HttpURLConnection HttpClient 11
多行字符串拼接 文本块 15

实际示例

DTO / POJO → RecordJava 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) {}
  • 默认不可变
  • 自动生成 equalshashCodetoString
  • 兼容 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+ 个并发订单。


工作原理

  1. 检测 Java 版本 — 从 pom.xmlbuild.gradlegradle/libs.versions.toml 中读取
  2. 仅加载相关特性 — Java 8 项目?不会出现虚拟线程建议
  3. 检测框架Spring Boot、Quarkus、Micronaut以提供框架专属建议
  4. 扫描 .java 文件 — 使用版本匹配的检测规则识别旧式模式
  5. 展示改造前后对比 — 每项转换均附带所需的最低 Java 版本
  6. 生成现代化报告 — 包含已修改文件、节省行数、发现的模式
## 现代化报告

项目版本Java 21
扫描文件数47
发现模式数23
节省行数:~32014%

| 文件                    | 模式               | 节省行数    |
|-------------------------|--------------------|-------------|
| UserResponse.java       | DTO → Record       | 44         |
| OrderService.java       | for 循环 → Stream  | 12         |
| ApiClient.java          | HttpURLConnection  | 28         |
| TaskExecutor.java       | 平台 → 虚拟线程    | 8          |

支持的版本与框架

Java 版本 加载的特性
811 Lambda、Stream、Optional、CompletableFuture、var、HttpClient
1217 Switch 表达式、文本块、Record、模式匹配、密封类
1821 虚拟线程、模式匹配 Switch、Record 模式、有序集合
2225 未命名变量、Stream Gatherers、ScopedValue、灵活构造函数、紧凑源文件

框架感知转换:

  • Spring Boot — 用 RestClient 替代 RestTemplateRecord 配合 @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 标准的智能体。

skills CLI 由 vercel-labs/skills 发布。 固定使用 @1.4.1 可确保运行经过验证的版本。


安全性

本技能仅包含 Markdown 和 Java 代码示例 — 无可执行脚本、无网络调用、无依赖项、不收集任何数据。

  • 读取范围: 扫描当前项目中的 .java 文件和构建描述文件(pom.xmlbuild.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 templatesSTR."...")—— Java 23 中已撤回,不推荐使用

基于 Agent Skills 开放标准构建。版本感知范围覆盖 Java 8 至 25。