本文目录导读:

截至 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 的用法或需要一个实战例题,我可以为你展开说明。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播