章节导读
本章定位:JDK 22-25 是 Java 进入"每年两发"成熟期的四个版本。与 JDK 18-21 的"颠覆性特性"不同,这一阶段的演进以"语法简化"和"API 补完"为主线——Stream 终于支持自定义中间操作,字符串拼接有了类型安全的模板语法,main 方法可以像脚本一样简洁。本章以"飞翔科技开发体验升级"为实战主线,剖析这些让代码写起来更顺手的特性。
为什么需要学习 JDK 22-25?
2024 年到 2025 年,JDK 以每六个月一个版本的速度稳步推进。很多人会觉得"JDK 21 已经够新了,22-25 能有什么干货?"但白歌在飞翔科技技术周会上指出:
- Stream 的短板终于被补上:
Stream Gatherers让你可以像写filter/map一样,自定义任意中间操作——窗口滑动、去重、折叠、批处理,再也不用把 Stream 转成 List 再手动处理 - 字符串拼接进入类型安全时代:
STR."Hello \{name}"不是语法糖,它把字符串插值从运行期拼接触发错误,变成了编译期类型检查——\{user.age}如果age是Integer,编译器会报错而不是运行时报toString()异常 - Hello World 可以只有一行:隐式声明类让
void main() { ... }直接成为合法代码,不再需要public class Hello { ... }的样板——这对教学、脚本、快速原型意义重大 - 模式匹配覆盖原始类型:
switch (obj) { case int i -> ... }终于可以直接匹配原始类型,无需装箱拆箱
白歌(飞翔科技架构师):"JDK 22-25 的特性不像虚拟线程那样改变架构,但它们是每天都在用的'手感优化'。当你写了一个
Stream.of(...)却发现没有想要的中间操作,当你拼接 SQL 字符串时担心注入风险,当你教新人写 Java 时被public static void main的仪式感劝退——这些版本的特性就是来解决这些'日常烦躁'的。"
本章知识图谱
四大核心特性一览
| 特性 | 版本路线 | 解决什么问题 | 对应章节 | 难度 |
|---|---|---|---|---|
| Stream Gatherers | JDK 22 预览 → JDK 24 第二预览 | Stream 缺少自定义中间操作的能力,复杂处理需中断流 | StreamGatherers.md | ★★★ |
| 字符串模板 | JDK 22 预览 → JDK 23 第二预览 → JDK 24 第三预览 → JDK 25 可能正式 | 字符串拼接缺乏类型安全,运行时才发现格式错误 | 字符串模板.md | ★★ |
| 隐式声明类 | JDK 23 预览 → JDK 24 第二预览 | main 方法需要样板代码(public class + static),对教学不友好 | 隐式声明类.md | ★ |
| 原始类型模式匹配 | JDK 24 预览 | 模式匹配不支持原始类型,需手动装箱拆箱 | 原始类型模式匹配.md | ★★ |
学习路径建议
学习建议:隐式声明类和字符串模板是"立即可用"的特性——前者让你写 demo 更快,后者让你写日志/SQL/配置更安全。Stream Gatherers 需要你对 Stream API 有较深理解才能体会其威力,建议放在最后。
实战场景:飞翔科技开发体验升级
大翔在 2025 年 Q1 技术回顾会上说:"我们的代码库已经有 80% 用上了 JDK 21 的虚拟线程和模式匹配,但开发团队每天都在抱怨一些'小别扭'——Stream 处理时间窗口数据时要先 collect 再循环,日志模板拼接时字符串和变量混在一起容易出错,新人培训时第一行代码就要解释 public static void main 的每个单词。JDK 22-25 就是来解决这些'小别扭'的。"
核心角色:
| 角色 | 身份 | 本章表现 |
|---|---|---|
| 大翔 | CTO | 推动 JDK 25 基线升级,关注 Stream Gatherers 对实时计算的提升 |
| 白歌 | 架构师 | 制定字符串模板的安全规范,防止 SQL/日志注入 |
| 小崔 | 后端开发 | 用 Stream Gatherers 重构实时指标聚合,代码量减少 40% |
| 孔蓝 | 后端新人 | 用隐式声明类写脚本和单元测试,上手速度大幅提升 |
| 黄俪 | 前端 | 用字符串模板生成类型安全的 GraphQL 查询 |
| 李眉 | 运维 | 用原始类型模式匹配处理监控指标的数值路由 |
环境要求
| 项目 | 最低版本 | 推荐版本 |
|---|---|---|
| JDK | 22(部分特性需预览参数) | 25 LTS |
| IDE | IntelliJ IDEA 2024.1+ | 2024.3+ |
| 构建工具 | Maven 3.9+ / Gradle 8.5+ | Maven 3.9+ |
重要:本章部分特性在 JDK 22-24 中仍为预览特性(Preview),编译和运行需要
--enable-preview --release <version>参数。如使用 JDK 25 LTS,部分特性可能已正式转正。
预备知识自检
在开始本章学习之前,请确认你已经掌握:
- [x] JDK 8 Stream API(中间操作与终止操作,自定义 Collector)
- [x] JDK 16 instanceof 模式匹配
- [x] JDK 21 Switch 模式匹配和 Record 模式匹配
- [x] JDK 15 文本块(Text Blocks)
- [x] Java 字符串格式化(
String.format、MessageFormat)
面试分值分布
JDK 22-25 的特性在面试中占比尚不高(2025 年),但 Stream Gatherers 和字符串模板是两个增长最快的考点。前者考察你对 Stream 中间操作原理的理解,后者考察类型安全意识和模板注入防御。
面试考点
面试官常问的三个问题:
问题一:"Stream Gatherers 和 Collector 有什么区别?什么时候用 Gatherer?"
答案:
Collector是终止操作——它消费 Stream 中的所有元素,产生一个最终结果(如List、Map、sum)。一旦调用collect(),Stream 就结束了。Gatherer是中间操作——它消费 Stream 中的元素,产生新的 Stream,可以继续链式调用。典型的 Gatherer 场景包括:滑动窗口(每 3 个元素为一组)、去重(只保留连续重复中的第一个)、折叠(将相邻元素两两合并)、批处理(每 100 条数据批量处理)。简单说:collect是"到此结束",gather是"继续流转"。
问题二:"字符串模板和传统的字符串拼接(+)或 String.format() 有什么本质区别?"
答案:本质区别在于处理时机和安全模型。
+拼接和String.format()都是在运行时将变量转为字符串并拼接,类型错误(如传入 null)在运行时才暴露,且没有注入防护能力。字符串模板STR."Hello \{name}"的处理分为两个阶段:首先,编译器解析模板结构,生成包含类型信息的中间表示;然后,处理器(如STR、FMT、RAW)在运行期根据类型信息进行安全的值插入。更关键的是,字符串模板允许自定义处理器——比如SQL."SELECT * FROM users WHERE id = \{userId}"可以由 SQL 处理器自动进行参数化查询,从根本上防止 SQL 注入。这是从"运行时字符串操作"到"编译期结构化处理"的范式转变。
问题三:"隐式声明类对实际生产代码有什么价值?还是只是教学工具?"
答案:短期看,隐式声明类最大的价值确实是降低 Java 的学习曲线——新人写第一行代码时不再需要理解
public、class、static、void、String[] args等概念的全部分量。但长期看,它还有三个生产价值:第一,快速原型和脚本——void main() { ... }可以直接运行,无需创建.java文件和类声明,配合java --source 25可以直接执行单文件程序;第二,单元测试的简化——测试类可以省略样板声明;第三,为 Java 的"渐进式复杂性"设计铺路——简单程序保持简单,复杂程序保留全部能力,这是现代语言设计的重要趋势。
大翔:"JDK 21 让我们重新思考并发和类型,JDK 22-25 让我们重新思考'写代码的体感'。好的语言特性不是让你写更复杂的代码,而是让简单的代码保持简单,复杂的代码保持可控。Stream Gatherers 让流处理不必中断,字符串模板让拼接不必提心吊胆,隐式声明类让第一行代码不必背诵八股——这就是进步。"