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

215 lines
7.4 KiB
Markdown
Raw Normal View History

2026-04-07 11:44:56 +08:00
# 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<T>` | `ScopedValue<T>` | 25 |
| `HttpURLConnection` | `HttpClient` | 11 |
| 多行字符串拼接 | 文本块 | 15 |
---
## 实际示例
### DTO / POJO → RecordJava 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<Order> 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<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.xml``build.gradle``gradle/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` 替代 `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。*