当前位置: 首页 > ds >正文

获取 Stream 对象的方式

在 Java 中获取 Stream 对象的方式多种多样,涵盖了集合、数组、文件、生成器等场景。以下是 12 种常见获取 Stream 的方式及详细说明:


1. 从集合获取 Stream

所有实现 Collection 接口的类(如 ListSetQueue)均可直接通过 stream()parallelStream() 方法获取流。

List<String> list = Arrays.asList("A", "B", "C");// 获取顺序流
Stream<String> stream = list.stream();// 获取并行流
Stream<String> parallelStream = list.parallelStream();

2. 从数组获取 Stream

通过 Arrays.stream()Stream.of() 将数组转换为流。

String[] array = {"Java", "Python", "C++"};// 方式1:Arrays.stream()
Stream<String> stream1 = Arrays.stream(array);// 方式2:Stream.of()
Stream<String> stream2 = Stream.of(array);// 基本类型数组(避免装箱开销)
int[] intArray = {1, 2, 3};
IntStream intStream = Arrays.stream(intArray);

3. 从文件获取 Stream

使用 Files.lines() 逐行读取文件内容生成流。

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;try (Stream<String> lines = Files.lines(Paths.get("data.txt"))) {lines.forEach(System.out::println);
} catch (IOException e) {e.printStackTrace();
}

4. 从 I/O 资源获取 Stream

BufferedReaderlines() 方法生成流。

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.stream.Stream;try (BufferedReader reader = new BufferedReader(new FileReader("data.txt"))) {Stream<String> lines = reader.lines();lines.forEach(System.out::println);
} catch (IOException e) {e.printStackTrace();
}

5. 生成无限流

通过 Stream.iterate()Stream.generate() 生成无限序列。

// 生成斐波那契数列的前10项
Stream.iterate(new int[]{0, 1}, fib -> new int[]{fib[1], fib[0] + fib[1]}).limit(10).map(fib -> fib[0]).forEach(System.out::println);// 生成随机数流
Stream<Double> randoms = Stream.generate(Math::random).limit(5);

6. 通过 Stream.Builder 构建流

动态添加元素生成流。

Stream.Builder<String> builder = Stream.builder();
builder.add("Apple").add("Banana").add("Cherry");
Stream<String> stream = builder.build();

7. 从字符串分割获取 Stream

使用 Pattern.splitAsStream() 分割字符串生成流。

import java.util.regex.Pattern;
import java.util.stream.Stream;Stream<String> words = Pattern.compile(", ").splitAsStream("Java, Python, C++");
words.forEach(System.out::println); // 输出: Java Python C++

8. 合并多个流

通过 Stream.concat() 合并两个流。

Stream<String> stream1 = Stream.of("A", "B");
Stream<String> stream2 = Stream.of("C", "D");
Stream<String> merged = Stream.concat(stream1, stream2); // A, B, C, D

9. 基本类型流

通过 IntStreamLongStreamDoubleStream 处理基本数据类型。

// 生成范围流
IntStream range = IntStream.range(1, 5); // 1, 2, 3, 4// 从集合转换
List<Integer> numbers = Arrays.asList(1, 2, 3);
IntStream intStream = numbers.stream().mapToInt(Integer::intValue);

10. 空流

通过 Stream.empty() 创建空流。

Stream<String> emptyStream = Stream.empty();

11. 单元素流

通过 Stream.of() 创建包含单个元素的流。

Stream<String> singleElementStream = Stream.of("Hello");

12. 其他第三方库

GuavaApache Commons 提供的工具类:

// Guava 示例:从 Iterable 创建流
Iterable<String> iterable = Lists.newArrayList("A", "B");
Stream<String> guavaStream = StreamSupport.stream(iterable.spliterator(), false);

总结:Stream 获取方式速查表

场景方法/类示例
集合Collection.stream()list.stream()
数组Arrays.stream()Stream.of()Arrays.stream(array)
文件Files.lines()Files.lines(Paths.get("data.txt"))
I/O 资源BufferedReader.lines()reader.lines()
无限序列Stream.iterate() / generate()Stream.iterate(0, n -> n + 1)
动态构建流Stream.BuilderStream.builder().add("A").build()
字符串分割Pattern.splitAsStream()Pattern.compile(",").splitAsStream(s)
合并流Stream.concat()Stream.concat(s1, s2)
基本类型流IntStream / LongStreamIntStream.range(1, 5)
空流Stream.empty()Stream.empty()
单元素流Stream.of()Stream.of("Hello")
第三方库支持Guava / Apache CommonsStreamSupport.stream(iterable)
http://www.xdnf.cn/news/9004.html

相关文章:

  • 【C++进阶篇】红黑树的封装(赋源码)
  • md650透传
  • 字节跳动2025年校招笔试手撕真题教程(二)
  • Spyglass:目标文件(.spq)的结构
  • 汉诺塔超级计算机数据区结构和源代码详细设计
  • vue3组件--无限滚动效果
  • 算法题(155):线段覆盖
  • ADSY1100系统级模块(SOM)4 Tx/4 Rx, 0.1 GHz to 20 GHz
  • 【Java】多线程_创建线程的四种方式
  • 【测试】——AS/400快速入门
  • 可编程幻彩LED灯条的设计
  • Python文件操作完全指南
  • 【TypeScript】结构化类型系统与标明类型系统
  • Linux 内核学习(8) --- 字符设备操作函数
  • SpringBoot中消息转换器的选择
  • some java面试题
  • 第三方检测机构如何凭借专业公正保障软件质量?资质有哪些?
  • ELF文件的作用详解
  • STL 标准模板库全面解析:容器、算法与迭代器的核心应用
  • Eigen 库实现最小二乘算法(Least Squares)
  • 如何用AI实现需求分析
  • Newtonsoft Json序列化数据不序列化默认数据
  • LeetCode 1345 跳跃游戏 IV
  • CentOS7更新 GLIBC 2.25
  • 基于亚博K210开发板——六轴姿态传感器水平测试板验证
  • Java集合使用中的常见错误与最佳实践
  • Oracle 如何实现AI自然语言查询
  • MySQL索引深度解析:从原理到实践
  • STM32的内部FLASH
  • JVM相关