284. Java Stream API - 流创建指南:Stream.of()与Arrays.stream()的适用场景与区别

33 阅读2分钟

284. Java Stream API - 流创建指南:Stream.of()与Arrays.stream()的适用场景与区别


✅ 背景介绍

在日常开发中,我们经常需要从一组已有元素(比如数组、常量列表等)中创建流。Java 提供了两种简单且直观的方式:

  1. Stream.of(...):从 可变参数(varargs) 创建流。
  2. 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)它不会拆数组,而是视为单元素