文章目录
- [282. Java Stream API - 从 Collection 或 Iterator 创建 Stream](#282. Java Stream API - 从 Collection 或 Iterator 创建 Stream)
-
-
- [✅ 一、从 Collection 创建 Stream(最常见方式)](#✅ 一、从 Collection 创建 Stream(最常见方式))
- [🧩 二、`Map` 没有 `stream()`,那怎么办?](#🧩 二、
Map没有stream(),那怎么办?) -
- [📌 示例:打印 Map 中的键值对](#📌 示例:打印 Map 中的键值对)
- [🧵 三、从 Iterator 创建 Stream(进阶用法)](#🧵 三、从 Iterator 创建 Stream(进阶用法))
-
- [🧙 模式结构:](#🧙 模式结构:)
- [🧪 示例:从自定义 Iterator 创建 Stream](#🧪 示例:从自定义 Iterator 创建 Stream)
- [🔍 关键参数解析](#🔍 关键参数解析)
- [💡 用途场景](#💡 用途场景)
- [🧠 小结](#🧠 小结)
- [🚀 结语](#🚀 结语)
-
282. Java Stream API - 从 Collection 或 Iterator 创建 Stream
✅ 一、从 Collection 创建 Stream(最常见方式)
这是最常见、最推荐的方式。
java
List<String> list = List.of("Java", "Python", "Go");
Stream<String> stream = list.stream();
几乎所有实现了 Collection 接口的容器(如 List、Set)都可以这样创建流。
🧩 二、Map 没有 stream(),那怎么办?
Map 接口不直接提供 stream() 方法,但它提供了三个间接路径:
| 想处理什么 | 使用的方法 | 示例代码 |
|---|---|---|
| 处理键 | map.keySet().stream() |
|
| 处理值 | map.values().stream() |
|
| 处理键值对 | map.entrySet().stream() |
✅ 最常用! |
📌 示例:打印 Map 中的键值对
java
Map<String, Integer> scores = Map.of("Alice", 90, "Bob", 85, "Charlie", 95);
scores.entrySet().stream()
.filter(e -> e.getValue() > 90)
.forEach(e -> System.out.println(e.getKey() + " got " + e.getValue()));
输出:
java
Charlie got 95
🧵 三、从 Iterator 创建 Stream(进阶用法)
Iterator 是一种轻量级的数据访问方式。虽然不能直接转为 Stream,但 Java 提供了一种"桥接"模式:
🧙 模式结构:
java
Iterator<T> → Spliterator<T> → Stream<T>
🧪 示例:从自定义 Iterator 创建 Stream
java
Iterator<Integer> iterator = new Iterator<>() {
private int index = 0;
public boolean hasNext() {
return index < 10;
}
public Integer next() {
return index++;
}
};
long estimateSize = 10L; // 估计元素数量
int characteristics = 0; // 特性(稍后讲)
Spliterator<Integer> spliterator = Spliterators.spliterator(iterator, estimateSize, characteristics);
boolean parallel = false;
Stream<Integer> stream = StreamSupport.stream(spliterator, parallel);
List<Integer> list = stream.toList();
System.out.println("list = " + list);
输出:
java
list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
🔍 关键参数解析
| 参数 | 作用说明 |
|---|---|
estimateSize |
你预估的数据量,影响流的优化(不是必须精确) |
characteristics |
表示流是否是有序、不可变、大小已知等(以后会讲) |
parallel |
是否并行处理(true:多线程,false:单线程) |
💡 用途场景
这种方式常用于:
- 第三方库只暴露 Iterator
- 想将老旧代码中的迭代器逻辑现代化为 Stream 流式处理
- 在不使用额外集合(如 List)前提下,对数据做流式转换
🧠 小结
| 创建来源 | 推荐方式 |
|---|---|
| List/Set | collection.stream() |
| Map | map.entrySet().stream() |
| Iterator | StreamSupport.stream(...) 进阶方式 |
🚀 结语
尽管我们最常用的是 collection.stream(),但在复杂项目中,你可能会处理 Map、Iterator、甚至是数据库游标。这时灵活使用各种流创建方式,将极大提升你的代码表现力与可维护性。