Java创建Stream流需三步:选对数据源、调用正确方法、注意生命周期;List/Set等集合可直接stream(),Map需转keySet()等,数组须用Arrays.stream()或Stream.of(),流不可重复使用且惰性求值。

Java 中创建 Stream 流来处理集合数据,核心是三步:选对数据源、调用正确方法、注意流的生命周期。不是所有集合都能直接 stream(),也不是所有数组写法都等效。
从 List、Set 等单列集合创建流
绝大多数 Collection 实现类(如 ArrayList、LinkedList、HashSet)都继承自 Collection 接口,自带 stream() 和 parallelStream() 方法。
- 普通顺序流:
List<string> list = Arrays.asList("a", "b", "c"); Stream<string> s = list.stream();</string></string> - 并行流(适合大数据量、无状态操作):
list.parallelStream() - 注意:Map 及其子类(如 HashMap)不实现 Collection,不能直接调用 stream();需转成 keySet()、values() 或 entrySet() 后再创建流,例如:
map.keySet().stream()
从数组创建流
数组不是集合,不能直接点 stream(),必须借助工具类或静态工厂方法:
- 用 Arrays.stream()(推荐):
String[] arr = {"x", "y"}; Stream<string> s = Arrays.stream(arr);</string> - 用 Stream.of()(适合少量字面量):
Stream<integer> s = Stream.of(1, 2, 3);</integer>—— 它内部会把参数包装为数组再调用 Arrays.stream - 注意:基本类型数组(如 int[])用 Arrays.stream() 会返回 IntStream,不是 Stream
;若需引用流,得先 boxed: Arrays.stream(intArray).boxed()
其他常用创建方式
除了集合和数组,还有几种实用场景下的流创建方式:
立即学习“Java免费学习笔记(深入)”;
- 空流:
Stream.empty()—— 安全替代 null,避免 NPE - 生成无限流(配合 limit 使用):
Stream.iterate(0, n -> n + 2).limit(5)生成前 5 个偶数;Stream.generate(Math::random).limit(3)生成 3 个随机数 - 字符串字符流:
"hello".chars()返回 IntStream;"hello".codePoints()更准确处理 Unicode 补充字符
关键提醒
Stream 是一次性消费的,不可重复使用;中间操作(如 filter、map)不执行,只记下逻辑;只有遇到终止操作(如 collect、forEach、count)才会真正触发流水线执行。误在中间操作里写副作用代码(比如 System.out.println),可能因惰性求值而不输出——这不是 bug,是设计使然。


















