Java Stream 创建方式多样,需按数据来源灵活选择:集合调用stream()或parallelStream();Map需转entrySet等再流化;数组区分引用与基本类型;Stream.of适合小规模硬编码;generate/iterate配合limit生成动态流;文件和字符串也可直接转Stream。

Java Stream 的创建不是“只有一种写法”的固定套路,而是根据数据来源灵活选择入口。掌握不同创建方式,能让你在处理测试数据、批量转换、模拟序列等场景中更高效、更安全。
从集合创建 Stream 最常用也最直观
几乎所有业务代码都从 List 或 Set 开始。调用 stream() 得到顺序流,parallelStream() 得到并行流。注意 Map 本身不直接支持 stream(),需先转为 entrySet、keySet 或 values:
List.of("a", "b", "c").stream()-
new HashSet(Arrays.asList(1, 2, 2)).stream()—— 自动去重后流式处理 -
map.entrySet().stream()处理键值对,比遍历更函数化
数组转 Stream 要区分引用类型和基本类型
引用类型数组(如 String[])用 Arrays.stream(array) 即可;但 int[]、long[]、double[] 等基本类型数组不能直接用该方法——它会把整个数组当作一个元素。正确做法是用对应专用方法:
-
Arrays.stream(new String[]{"x", "y"})✅ -
Arrays.stream(new int[]{1, 2, 3})❌(返回 Stream) -
IntStream.of(1, 2, 3)或Arrays.stream(new int[]{1, 2, 3})✅(后者需导入java.util.Arrays,实际返回 IntStream)
用 Stream.of 快速构造小规模流
适合硬编码少量元素、单元测试造数或临时调试。支持泛型推断,也支持 null(但后续操作可能抛 NPE,需留意):
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
Stream.of("hello", "world")Stream.of(1, 2, 3, 4).filter(n -> n % 2 == 0).toList()- 传入单个数组会将其整体作为流的一个元素,如
Stream.of(arr)≠Arrays.stream(arr)
生成器函数适合动态/无限数据流
当没有现成数据源,而需要按规则生成时,Stream.generate() 和 Stream.iterate() 是核心工具。关键点是:必须配合 limit() 使用,否则流不会终止:
-
Stream.generate(Math::random).limit(5)—— 生成 5 个随机数 -
Stream.iterate(0, n -> n + 2).limit(10)—— 偶数序列 0, 2, 4…18 -
Stream.generate(() -> new User()).limit(100)—— 批量构造测试对象
文件和字符串也能直接变成 Stream
IO 操作天然适合流式处理。一行一元素的文本文件,可用 Files.lines(Paths.get("file.txt")) 直接获得 Stream;字符串按行、按字符、按单词拆分也有对应方法:
-
Files.lines(path, StandardCharsets.UTF_8)—— 自动关闭资源(建议 try-with-resources) -
"a,b,c".split(",").length不够函数化,改用Arrays.stream("a,b,c".split(",")) -
"hello".chars().mapToObj(c -> (char)c).collect(Collectors.toList())获取字符流
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










