章节导读
本章定位:JDK 9、10、11 三个版本在 JDK 8 奠定的函数式基石之上,从语法糖、API 增强、运行时优化三个维度对 Java 进行了系统性打磨。本章以"飞翔科技基础设施升级"为实战主线,逐一剖析这些务实而强大的新特性。
为什么需要学习 JDK 9-11?
2017 年 9 月,Oracle 宣布 Java 进入六个月快速发布节奏。JDK 9(2017.9)、JDK 10(2018.3)、JDK 11(2018.9,LTS)在短短一年内密集发布。很多开发者因此产生了疑问:"JDK 8 已经够用了,为什么要升级?"
大翔在飞翔科技全员技术大会上给出了三个理由:
- 开发效率:
var减少冗余类型声明,List.of()替代Arrays.asList(),Files.readString()一行代码读文件——这些不是语法糖,是实实在在的少写代码、少出 Bug - API 成熟度:
Optional.ifPresentOrElse()、Stream.takeWhile()、String.isBlank()填补了 JDK 8 API 的设计缺口,让函数式编程体验更完整 - 生产就绪:JDK 11 是继 JDK 8 之后第二个 LTS 版本,HTTP Client 正式转正、ZGC 低延迟垃圾回收器实验性引入——这是面向未来的基础设施
白歌(飞翔科技架构师):"JDK 9-11 的特性不像 Lambda 那样颠覆认知,但它们是 JDK 8 的'补完计划'——把 JDK 8 遗留的设计粗糙之处一一打磨精致。如果你能熟练运用 Optional,却不知道
or()和ifPresentOrElse()的存在,说明你的知识停留在 2014 年。"
本章知识图谱
七大核心特性一览
| 特性 | 版本 | 解决什么问题 | 对应章节 | 难度 |
|---|---|---|---|---|
| var 类型推断 | JDK 10 | 减少冗长的类型声明,让代码更简洁 | var类型推断.md | ★★ |
| 接口 private 方法 | JDK 9 | 消除 default 方法间的重复代码 | 接口增强.md | ★★ |
| String 新方法 | JDK 11 | 填补 String 工具方法的空白:空白判断、去空格、按行分割、重复 | String新方法.md | ★ |
| Optional 增强 | JDK 9/10/11 | 补全 Optional 的条件分支和流式转换能力 | Optional增强.md | ★★ |
| 集合工厂方法 | JDK 9/10/11 | 一行代码创建不可变集合,更安全、更简洁 | 集合增强.md | ★★ |
| Stream 增强 | JDK 9 | 增加 takeWhile/dropWhile/ofNullable 等边界控制方法 | Stream增强.md | ★★★ |
| HTTP Client + Files | JDK 11 | 提供标准化的 HTTP 客户端和一行式文件读写 | HTTP_Client与Files增强.md | ★★★ |
学习路径建议
学习建议:
- var 和集合增强可以先看:这两个特性上手最快,学完就能在日常代码中使用
- String 新方法是"性价比"最高的:
isBlank()和strip()虽然简单,但能避免大量null判断和正则表达式 - Optional 增强要在理解 JDK 8 Optional 之后学习:如果对
map/flatMap/orElseGet还不熟,建议先复习第16章 - Stream 增强的 takeWhile/dropWhile 需要一定场景感:建议结合实际数据处理的例子来理解
- HTTP Client 可以单独学习:它与其他特性几乎没有依赖关系,可按需查阅
实战场景:飞翔科技基础设施升级
本章所有代码示例将继续围绕飞翔科技的日常开发场景展开:
飞翔科技 CTO 大翔在 2025 年初做出决策:将公司所有新项目的 JDK 基线从 JDK 8 升级到 JDK 11 LTS。升级过程中,团队遇到了各种"JDK 8 时代能用但不够优雅"的编码场景——这正是 JDK 9-11 新特性大显身手的地方。
核心角色:
| 角色 | 身份 | 本章表现 |
|---|---|---|
| 大翔 | CTO | 推动 JDK 升级决策,关注生产就绪特性(HTTP Client、GC 改进) |
| 白歌 | 架构师 | 制定升级规范,强调"什么场景用什么特性"的最佳实践 |
| 小崔 | 后端开发(3 年经验) | 从 JDK 8 迁移的主力,从"var 真香"到深入理解 Optional 增强 |
| 孔蓝 | 后端开发(1 年经验) | 没经历过 JDK 8 之前的时代,对新特性接受度高,但需要理解设计意图 |
| 黄俪 | 前端开发 | 负责调用后端新 HTTP Client 暴露的 REST API |
| 李眉 | 运维工程师 | 关注 ZGC 低延迟、JFR 性能监控、单文件程序部署 |
环境要求
| 项目 | 要求 |
|---|---|
| JDK 版本 | JDK 11 及以上(推荐 JDK 11.0.21+ LTS) |
| IDE | IntelliJ IDEA 2023+ / Eclipse 2023+ |
| 构建工具 | Maven 3.8+ 或 Gradle 7+ |
| 操作系统 | Windows / macOS / Linux 均可 |
大翔(CTO):"JDK 11 是我们的生产基线,JDK 17 是新项目的推荐版本。本章的内容在生产环境中可以直接使用——这不是'学了但用不上'的知识,是'明天 Code Review 就能用上'的技能。"
预备知识自检
在开始本章学习之前,请确认你已经掌握:
- [x] Lambda 表达式和函数式接口(
@FunctionalInterface) - [x] Stream API 基础操作(
filter/map/collect/flatMap) - [x] Optional 的基本用法(
ofNullable/map/orElse/orElseGet) - [x] Java 集合框架(List / Set / Map 及其实现类的特性)
- [x] 接口的 default 方法和 static 方法(JDK 8 引入)
- [x] 基本的文件 I/O 操作(
Files.readAllLines/BufferedReader)
如果你对以上知识点有遗忘,建议先复习第 16 章(JDK 8 新特性)和第 12 章(集合框架)的核心内容。
面试分值分布
面试中 JDK 版本演进相关的问题越来越常见,尤其是以下高频考点:
- var 能不能用于类字段?(不能——仅限局部变量)
List.of()创建的集合能修改吗?(不能——不可变,调用 add 会抛 UnsupportedOperationException)isBlank()和isEmpty()的区别?(isBlank会把纯空白字符视为空,isEmpty只看长度是否为 0)orElse()和orElseGet()的区别?(orElse无论 Optional 是否有值都执行参数表达式,orElseGet惰性求值)- JDK 9 为什么允许接口有 private 方法?(为 default 方法提供代码复用,避免重复逻辑)
白歌(架构师):"JDK 8 教会我们'函数式思维',JDK 9-11 教会我们'务实主义'。这些特性不炫技,但它们让 Java 代码从'能跑'变成'跑得漂亮'。掌握它们,你的代码评审通过率会大幅提升。"