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

215 lines
7.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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。*