本文目录导读:

截至 2025 年 5 月,Java 流 API(java.util.stream)在 Java 9、Java 11、Java 16、Java 17 和 Java 21 中都有新增方法,以下是主要新增方法及其说明(基于最新稳定版 Java 21):
Java 9 新增
| 方法 | 说明 |
|---|---|
Stream.ofNullable(T) |
创建包含单个元素的流,如果元素为 null 则返回空流 |
Stream.iterate(T seed, Predicate<T> hasNext, UnaryOperator<T> next) |
带终止条件的迭代流(三参数版本) |
Stream.takeWhile(Predicate) |
从流头部开始,一直取元素直到条件为假(包含第一个不满足条件的元素?不包含,这一点与 dropWhile 对称理解) |
Stream.dropWhile(Predicate) |
从流头部开始,丢弃元素直到条件为假,然后返回剩余所有元素 |
Stream.iterate(T seed, UnaryOperator) |
无限流,原来是 iterate(T, UnaryOperator) 无重载,现在变成了两参数版(实际Java 8已有此方法,但9明确增加的是三参数版) |
注意:takeWhile / dropWhile 在 有序流 和 无序流 上的行为不同(无序流上可能任意丢弃)。
Java 11 新增
| 方法 | 说明 |
|---|---|
Stream.toArray(IntFunction<A[]>) |
已有,但 Java 11 未在 Stream 接口上直接新增方法,Java 11 主要是对 Optional、String、Files 等的增强,而 Stream API 本身没有新增方法。 |
但注意:Stream.toList() 是 Java 16 才引入的(常被误认为是11)。 |
Java 16 新增(重要的一个版本)
| 方法 | 说明 |
|---|---|
Stream.toList() |
将流元素收集为不可变列表(List<T>,返回类型是 List 但实际是 ImmutableCollections) |
Stream.mapMulti(BiConsumer<T, Consumer<R>>) |
允许每个元素映射到零个或多个元素(类似 flatMap 但更灵活、性能更好) |
Stream.mapMultiToInt / mapMultiToLong / mapMultiToDouble |
对应原始类型的版本 |
mapMulti 示例:
Stream.of("a", "bc", "def")
.mapMulti((s, consumer) -> {
for (char c : s.toCharArray()) {
consumer.accept(c);
}
})
.forEach(System.out::println); // 输出 a, b, c, d, e, f
Java 17 新增(无)
Java 17 是 LTS 版本,但 Stream API 没有新增方法。
Java 21 新增(最新 LTS 版本)
| 方法 | 说明 |
|---|---|
Stream.gather(Gatherer<T,A,R>) |
引入 自定义中间操作 的能力(预览特性,后来稳定于 Java 22) |
Stream.toList() 在 Java 21 中行为略有调整(性能优化,不变性保证更清晰) |
Gatherer 是 Java 21/22 最重磅的新特性,是流 API 的一次重大扩展,它允许开发者定义自己的中间操作(类似于 filter、map、flatMap 等),但能实现更复杂的有状态、分批、滑动窗口等操作。
示例:
// 对每两个元素进行分组 (pair)
Stream.of(1, 2, 3, 4, 5, 6)
.gather(Gatherers.windowFixed(2))
.forEach(System.out::println); // 输出 [1,2] [3,4] [5,6]
java.util.stream.Gatherers 内置了一些常用的收集器:
windowFixed(int):固定大小窗口windowSliding(int):滑动窗口foldLeft(Z, BiFunction<Z, T, Z>, Function<Z, R>):折叠操作mapConcurrent(int, Function<T, R>):并行映射(限制并发数)
Java 22 新增(已稳定)
| 方法 | 说明 |
|---|---|
Gatherer 相关 API 从预览转为 正式特性 |
包括 Gatherer 接口和 Gatherers 工具类 |
快速总结表
| Java 版本 | 新增方法 |
|---|---|
| Java 9 | ofNullable、三参数 iterate、takeWhile、dropWhile |
| Java 11 | 无(但 toList() 常被误认为11,实为16) |
| Java 16 | toList()、mapMulti 系列 |
| Java 17 | 无 |
| Java 21 | gather(Gatherer) + Gatherers 工具类 |
| Java 22 | Gatherer 正式稳定 |
如果你实际使用的是 Java 21 或 22,最值得关注的新方法是:
Stream.toList()—— 替代.collect(Collectors.toList()),更简洁且返回不可变列表Stream.gather(Gatherer)—— 自定义中间操作,功能极其强大
想深入 Gatherer 的用法或需要一个实战例题,我可以为你展开说明。