Java 8 → 21 语言特性演进技术白皮书
基于视频转录整理 | 覆盖版本:Java 9 ~ Java 21 LTS
1. 概述
Java 自 8 之后的演进呈现三条清晰主线:
| 主线 | 目标 | 代表特性 |
|---|---|---|
| 语法减负 | 减少样板代码,提升表达力 | var, record, Text Blocks, Switch 表达式 |
| 类型系统增强 | 编译期安全、穷举检查、代数数据类型 | sealed, record, Pattern Matching |
| 并发模型革新 | 同步代码享受异步性能 | Virtual Threads |
2. 语法糖与 API 增强
2.1 局部变量类型推断(Java 10+)
// Before
ArrayList<String> list = new ArrayList<String>();
// After
var list = new ArrayList<String>();
约束条件:
- 仅适用于有初始值的局部变量
- 不可用于成员变量、方法参数、返回值
- 不可用于
var x = null(编译器无法推断)
Lambda 扩展(Java 11): 允许在 Lambda 参数中使用 var,以便添加注解:
(var a, var b) -> a + b
2.2 不可变集合工厂方法(Java 9)
List<String> list = List.of("a", "b"); // 固定长度,不可变
Set<String> set = Set.of("a", "b");
Map<String, Integer> map = Map.of("k", 1);
行为特征:
- 传入
null元素直接抛出NullPointerException - 任何修改操作(
add/remove/set)抛出UnsupportedOperationException - 需要可变集合时,作为初始化器包装:
new ArrayList<>(List.of(...))
2.3 String & Stream API 升级(Java 9~11)
String 新方法
| 方法 | 说明 |
|---|---|
strip() | 去除 Unicode 空白字符(trim() 仅处理 ASCII 空格 \u0020) |
stripLeading() / stripTrailing() | 单侧去除 |
lines() | 返回 Stream<String>,支持链式操作(优于 split("\n") 返回数组) |
// 去空行并收集
str.lines()
.filter(s -> !s.isBlank())
.toList(); // Java 16+ Stream.toList()
Stream 有序流控制(Java 9)
| 方法 | 语义 | 与 filter 区别 |
|---|---|---|
takeWhile(Predicate) | 从头放行,遇到第一个不满足即截断 | filter 扫描全量;takeWhile 提前终止,对无限流/已排序流性能更优 |
dropWhile(Predicate) | 从头丢弃,遇到第一个满足才开始保留 | — |
2.4 Optional 语义强化
| 版本 | 变更 | 说明 |
|---|---|---|
| Java 9 | Optional.stream() | 空 Optional 返回空流,便于扁平化操作 |
| Java 10 | orElseThrow() 替代 get() | 强制调用者面对"值不存在"的现实,语义更清晰 |
2.5 Switch 表达式(Java 14 转正)
核心变化: 从"语句"进化为"表达式",具备返回值。
// 箭头语法,无 fall-through,无需 break
String result = switch (day) {
case MONDAY, FRIDAY -> "Meeting";
case TUESDAY -> "Coding";
default -> {
// 复杂逻辑块使用 yield 返回值
yield doSomething();
}
};
编译期约束: 编译器强制要求 exhaustive(穷举所有 case),遗漏分支直接编译失败。
2.6 Text Blocks(Java 15 转正)
String json = """
{
"name": "Java",
"version": 21
}
""";
格式化控制:
\s:显式保留单个空格(防止自动去除缩进)\(行尾反斜杠):代码中换行,但字符串值中不换行(适合长 SQL 拼接)