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

Java集合中Stream流的使用

前言

Java 8 引入了 Stream API,它是一种用于处理集合(Collection)数据的强大工具。Stream 不是数据结构,而是对数据源进行操作的一种方式,支持声明式、函数式的操作,如过滤、映射、排序等。

Stream 操作分为中间操作和终端操作:

  • 中间操作(Intermediate operations):返回一个 Stream,可以链式调用。
  • 终端操作(Terminal operations):触发实际计算,返回非 Stream 类型的结果。

获取 Stream 的方式

常见的创建 Stream 的方法如下:

// 从集合创建
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();// 从数组创建
int[] arr = {1, 2, 3};
IntStream intStream = Arrays.stream(arr);// 使用 Stream.of 创建
Stream<String> stream = Stream.of("a", "b", "c");// 无限流(generate / iterate)
Stream<Integer> infiniteStream = Stream.generate(() -> 1);
Stream<Integer> iterateStream = Stream.iterate(0, n -> n + 2);

Stream 的常用操作

filter

用于过滤符合条件的数据:

List<String> filtered = list.stream().filter(s -> s.startsWith("J")).toList();

map

将每个元素映射成另一个对象:

List<String> upperCase = list.stream().map(String::toUpperCase).toList();

sorted

对流中的元素进行排序:

List<String> sorted = list.stream().sorted().toList();

也可以自定义排序规则

.sorted((s1, s2) -> s2.compareTo(s1))

或者使用 Comparator:

.sorted(Comparator.reverseOrder())

limit / skip

限制流的大小或跳过前 N 个元素:

List<String> limited = list.stream().limit(2).toList();List<String> skipped = list.stream().skip(2).toList();

distinct

去重,基于 equals() 方法判断重复项:

List<String> unique = list.stream().distinct().toList();

forEach

遍历流中的每个元素:

list.stream().forEach(System.out::println);

collect

收集流的结果到容器中,常配合 Collectors 使用:

List<String> filteredList = list.stream().filter(s -> s.length() > 3).collect(Collectors.toList());String joined = list.stream().collect(Collectors.joining(", "));

reduce

归约操作,合并流中的元素为一个结果:

Optional<String> reduced = list.stream().reduce((s1, s2) -> s1 + "-" + s2);

也可以提供初始值:

String result = list.stream().reduce("start", (acc, s) -> acc + "-" + s);

并行流(Parallel Stream)

使用并行流可以提高大数据量下的处理效率:

List<String> parallelResult = list.parallelStream().filter(s -> s.startsWith("A")).toList();

需要注意线程安全问题和是否适合并行处理。

注意事项

  • Stream 只能被消费一次,再次使用会抛出异常。
  • 中间操作是惰性求值的,只有遇到终端操作才会真正执行。
  • 避免在流中修改外部变量,容易引发并发问题。
  • 适当使用并行流,不是所有情况都适用。
  • 注意空指针异常,尤其是在处理集合时。

总结

Stream API 极大地简化了对集合的操作,使得代码更简洁、可读性更高。通过链式调用,我们可以清晰地表达数据处理逻辑。但也要注意其性能特性和使用场景,合理选择是否使用 Stream 或传统循环。

http://www.lryc.cn/news/2401860.html

相关文章:

  • Python批量转换Word、Excel、PPT、TXT、HTML及图片格式到PDF,包含错误处理和日志记录功能
  • 数据分析Agent构建
  • vscode配置lua
  • 【笔记】MSYS2 的 MINGW64 环境 全面工具链
  • 国内头部的UWB企业介绍之品铂科技
  • Prj10--8088单板机C语言8259中断测试(2)
  • 《前端面试题:CSS对浏览器兼容性》
  • 使用 Docker Compose 安装 Redis 7.2.4
  • 35.x64汇编写法(二)
  • 安全大模型的思考
  • SQL Server 2025 预览版新功能
  • NineData云原生智能数据管理平台新功能发布|2025年5月版
  • 数学复习笔记 25
  • Linux可执行文件ELF文件结构
  • RAG:大模型微调的革命性增强——检索增强生成技术深度解析
  • DisplayPort 2.0协议介绍(1)
  • I2C通信讲解
  • 【信息系统项目管理师-选择真题】2025上半年(第一批)综合知识答案和详解
  • ABP VNext 在 Kubernetes 中的零停机蓝绿发布
  • linux 故障处置通用流程-36计-14-27
  • https和http有什么区别-http各个版本有什么区别
  • 基于回归算法的心理健康预测(EDA + 预测)
  • React Native开发鸿蒙运动健康类应用的项目实践记录
  • 【新品解读】一板多能,AXRF49 定义新一代 RFSoC FPGA 开发平台
  • 贪心算法应用:线性规划贪心舍入问题详解
  • YOLO在C#中的完整训练、验证与部署方案
  • 洛谷题目:P2761 软件补丁问题 (本题简单)
  • 智慧园区数字孪生全链交付方案:降本增效30%,多案例实践驱动全周期交付
  • 【OpenGL学习】(四)统一着色和插值着色
  • 42、响应处理-【源码分析】-浏览器与PostMan内容协商完全适配