文章目录
- [281. Java Stream API - 创建 Streams:打开流式编程的大门](#281. Java Stream API - 创建 Streams:打开流式编程的大门)
-
-
- [🎯 课程目标](#🎯 课程目标)
- [📦 最常见的方式:从集合创建](#📦 最常见的方式:从集合创建)
- [🏭 `Stream` 工厂方法大合集(`Stream API` 提供)](#🏭
Stream工厂方法大合集(Stream API提供)) -
- [🔨 示例:`Stream.of(...)` -- 多个值转流](#🔨 示例:
Stream.of(...)– 多个值转流) - [🎲 示例:`Stream.generate()` -- 无限流(记得限制)](#🎲 示例:
Stream.generate()– 无限流(记得限制)) - [➕ 示例:`Stream.iterate()` -- 无限递增流](#➕ 示例:
Stream.iterate()– 无限递增流) - [🧱 示例:`Stream.builder()` -- 手动添加元素构建流](#🧱 示例:
Stream.builder()– 手动添加元素构建流)
- [🔨 示例:`Stream.of(...)` -- 多个值转流](#🔨 示例:
- [📚 从其他结构中创建流](#📚 从其他结构中创建流)
-
- [📘 示例:字符串转字符流](#📘 示例:字符串转字符流)
- [🧪 示例:正则拆分字符串成流](#🧪 示例:正则拆分字符串成流)
- [📁 示例:读取文件的每一行(注意 `IOException`)](#📁 示例:读取文件的每一行(注意
IOException))
- [🧤 特殊情况:空流与条件创建流](#🧤 特殊情况:空流与条件创建流)
- [🧠 小结:流的创建方式速查表](#🧠 小结:流的创建方式速查表)
- [🎓 实战建议](#🎓 实战建议)
-
281. Java Stream API - 创建 Streams:打开流式编程的大门
🎯 课程目标
本节我们将学习各种创建 Stream 的方法,并通过示例掌握何时使用哪种方式。
✅ 了解 Stream 的多种来源
✅ 掌握工厂方法(Factory Methods)
✅ 掌握从集合、数组、字符串等常用类型创建流
✅ 知道特殊情况如何创建空流、无限流等
📦 最常见的方式:从集合创建
你之前最常用的方式就是:
java
List<String> list = List.of("Java", "Python", "Go");
Stream<String> stream = list.stream();
这是最基础也最直观的一种方式 ------ 来自 Collection 接口的 stream() 方法。
🏭 Stream 工厂方法大合集(Stream API 提供)
| 方法 | 用途 | 示例代码 |
|---|---|---|
Stream.of(...) |
从一个或多个元素构造流(支持 varargs) | Stream.of(1, 2, 3) |
Stream.empty() |
构造一个空流 | Stream.empty() |
Stream.generate() |
使用 Supplier 无限生成元素 |
Stream.generate(Math::random) |
Stream.iterate() |
使用初始值和函数构造一个无限流 | Stream.iterate(0, n -> n + 1) |
Stream.builder() |
使用构建器一步步手动添加元素构造流 | 见下方示例 |
🔨 示例:Stream.of(...) -- 多个值转流
java
Stream<String> languages = Stream.of("Java", "Python", "Kotlin");
languages.forEach(System.out::println);
🎲 示例:Stream.generate() -- 无限流(记得限制)
java
Stream<Double> randoms = Stream.generate(Math::random).limit(5);
randoms.forEach(System.out::println);
➕ 示例:Stream.iterate() -- 无限递增流
java
Stream<Integer> evens = Stream.iterate(0, n -> n + 2).limit(5);
evens.forEach(System.out::println);
🧱 示例:Stream.builder() -- 手动添加元素构建流
java
Stream<String> stream = Stream.<String>builder()
.add("Apple")
.add("Banana")
.add("Cherry")
.build();
stream.forEach(System.out::println);
📚 从其他结构中创建流
| 来源 | 方法/说明 | 示例代码 |
|---|---|---|
| 数组 | 使用 Arrays.stream() |
Arrays.stream(new int[]{1,2,3}) |
| Iterator | 使用 StreamSupport.stream() |
见下方说明 |
| 字符串字符流 | 使用 chars() → IntStream |
"hello".chars() |
| 按行读取文件 | Files.lines(Path) |
Files.lines(Paths.get("file.txt")) |
| 使用正则分割字符串 | Pattern.compile(regex).splitAsStream() |
见下方示例 |
| 随机数流 | new Random().ints() 等 |
new Random().ints(5) |
📘 示例:字符串转字符流
java
IntStream chars = "hello".chars();
chars.forEach(ch -> System.out.println((char) ch));
🧪 示例:正则拆分字符串成流
java
Stream<String> words = Pattern.compile(",\\s*")
.splitAsStream("apple, banana, cherry");
words.forEach(System.out::println);
📁 示例:读取文件的每一行(注意 IOException)
java
try (Stream<String> lines = Files.lines(Paths.get("data.txt"))) {
lines.forEach(System.out::println);
}
🧤 特殊情况:空流与条件创建流
有时你需要根据条件返回一个空流:
java
Stream<String> stream = list.isEmpty() ? Stream.empty() : list.stream();
比返回 null 更优雅,避免空指针异常(NPE)。
🧠 小结:流的创建方式速查表
| 类型 | 创建方式 |
|---|---|
| Collection | collection.stream() |
| 数组 | Arrays.stream(array) |
| 值列表 | Stream.of(...) |
| 无限流 | Stream.generate() / Stream.iterate() |
| 手动构造 | Stream.builder() |
| 字符串 | "abc".chars() |
| 正则拆分字符串 | Pattern.compile(...).splitAsStream(...) |
| 文件 | Files.lines(Path) |
| 随机数 | new Random().ints() |
| 空流 | Stream.empty() |
| Iterator | StreamSupport.stream(..., false)(进阶) |
🎓 实战建议
- 学习阶段 :先从
Collection.stream()和Stream.of()开始练习 - 日常开发 :结合
generate()和iterate()制作模拟数据或流控制结构 - 高阶使用:从文件、正则、随机数等创建"外部数据流"