284. Java Stream API - 流创建指南:Stream.of()与Arrays.stream()的适用场景与区别
✅ 背景介绍
在日常开发中,我们经常需要从一组已有元素(比如数组、常量列表等)中创建流。Java 提供了两种简单且直观的方式:
Stream.of(...):从 可变参数(varargs) 创建流。Arrays.stream(...):从 数组 创建流。
这两个方法功能相似,而且其实 Stream.of() 的底层实现就是调用了 Arrays.stream()。
🧪 示例一:使用 Stream.of(...)(适合传入多个单独元素)
Stream<Integer> intStream = Stream.of(1, 2, 3);
List<Integer> ints = intStream.toList();
System.out.println("ints = " + ints);
输出:
ints = [1, 2, 3]
🎯 应用场景:
- 快速创建一个包含固定元素的流
- 适合静态测试数据,如
Stream.of("A", "B", "C")
🧪 示例二:使用 Arrays.stream(...)(适合已有数组)
String[] stringArray = {"one", "two", "three"};
Stream<String> stringStream = Arrays.stream(stringArray);
List<String> strings = stringStream.collect(Collectors.toList());
System.out.println("strings = " + strings);
输出:
strings = [one, two, three]
🎯 应用场景:
- 当你已经有了数组,比如从方法参数中传入或从数据库读取
- 更适合需要处理大型数组数据的情况
🧠 概念比较与说明
| 方法 | 适用数据 | 特点 | 推荐场景 |
|---|---|---|---|
Stream.of(...) | 零个或多个独立元素(varargs) | 简洁、可读性高 | 创建小型测试数据或常量流 |
Arrays.stream(...) | 数组(如 String[]、int[]) | 支持基本类型专用重载,如 IntStream | 已有数组的处理 |
⚠️ 注意事项
Stream.of()和Arrays.stream()返回的都是顺序流(Sequential Stream),默认不会并行。Stream.of(array)会把整个数组当作一个元素!这点非常容易踩坑!
String[] arr = {"a", "b", "c"};
Stream<String[]> wrongStream = Stream.of(arr); // ❌ 只有一个元素,即整个数组
Stream<String> correctStream = Arrays.stream(arr); // ✅ 正确拆开为多个元素
🌟 拓展用法:结合 Collectors 和映射操作
String[] names = {"alice", "bob", "charlie"};
List<String> upperCaseNames = Arrays.stream(names)
.map(String::toUpperCase)
.toList();
System.out.println(upperCaseNames); // 输出: [ALICE, BOB, CHARLIE]
📚 小结
| 方法 | 用途 |
|---|---|
Stream.of(e1, e2, ...) | 从多个元素创建流 |
Arrays.stream(array) | 从已有数组创建流 |
小心 Stream.of(array) | 它不会拆数组,而是视为单元素 |