news 2026/6/23 20:45:42

Java Stream API 使用总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java Stream API 使用总结

Java 8之后,Stream API 已经成为日常开发中不可或缺的工具
但很多人对 Stream 的理解,仍停留在 filter + map + collect。
本文结合真实业务场景,总结 Stream API 的正确使用方式、常见误区和进阶技巧


一、为什么要用 Stream API

直奔主题嗷 ~ ,我们首先结合一组代码来体会一下不用 Stream API 和使用 Stream API 带给我们的便捷。

下图左方代码是没有使用 Stream API 的代码,我们通过增强 for 循环对 List 中的元素进行过滤,分离出其中年龄 > 18 的用户信息;右图则是使用了 Stream API 的代码,看出来了吗,代码的简洁程度、可读性?即使没有用过 Stream API,你是不是也能大致推断出右侧代码的含义呢?

大致说明:Stream 的核心价值

  • 声明式编程(关注做什么,而不是怎么做)
  • 链式调用,可读性强
  • 天然支持并行流
  • 减少临时变量和样板代码

二、Stream API 的整体执行流程(重点)

首先我们需要明确的是 Stream 并不是集合,而是对数据的一次性流水线处理。其大致结构是:

数据源 → 中间操作(0~N)→ 终止操作(1 个)

举个例子 ~

users.stream() // 数据源 .filter(u -> u.isValid()) // 中间操作 .map(User::getName) // 中间操作 .collect(Collectors.toList()); // 终止操作

⚠️注意:没有终止操作,Stream 不会执行


三、常用操作实战

(一)、常见中间操作

1️⃣ filter:过滤(最常用)

对字段进行过滤,是我们使用 Stream API 最为常见的需求。如果其中需要对字段进行判空,请注意:空值过滤一定要放在最前面、复杂条件可抽成方法,提高可读性。如下 ~

list.stream() .filter(Objects::nonNull) .filter(e -> e.getStatus() == 1) .collect(Collectors.toList());

2️⃣map:对象转化

典型场景:Entity → DTO、提取某个字段、类型转换。

List<Long> ids = users.stream() .map(User::getId) .collect(Collectors.toList());

3️⃣ flatMap:扁平化

和上述 map 的区别:map 是一对一,flatMap 则是一对多并拉平,详见代码:

List<String> allTags = articles.stream() .flatMap(a -> a.getTags().stream()) .distinct() .collect(Collectors.toList());

(二)、常见终止操作

1️⃣ collect:最常见

将经过处理的数据收集起来,可以转成 List, Set, 也可以转成 Map,如下:

// 1. 转 List Collectors.toList(); // 2. 转 Set Collectors.toSet(); // 3. 转 Map (注意可能出现的重复 key) Map<Long, User> map = users.stream() .collect(Collectors.toMap( User::getId, Function.identity(), (a, b) -> a // 冲突时保留第一个 ));

2️⃣ forEach vs forEachOrdered

并行流中 forEach 不保证顺序,如果需要顺序,则需要用forEachOrdered

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

3️⃣ anyMatch / allMatch / noneMatch

这几个非常适合做校验逻辑,如:

boolean hasInvalid = users.stream() .anyMatch(u -> !u.isValid());

(三)、常见联合操作

1️⃣ 排序

list.stream() .sorted(Comparator.comparing(User::getAge).reversed()) .collect(Collectors.toList());

2️⃣ 去重(按字段)

List<User> distinct = list.stream() .collect(Collectors.collectingAndThen( Collectors.toMap(User::getId, u -> u, (a, b) -> a), m -> new ArrayList<>(m.values()) ));

3️⃣ 模糊分页(仅适合小数据量)

list.stream() .skip((page - 1) * size) .limit(size) .collect(Collectors.toList());

四、Stream API 的常见坑

❌ Stream 不能复用

每次使用都需要重新 stream() 嗷 ~

Stream<User> stream = users.stream(); stream.count(); stream.collect(...); // 抛异常

❌ 在 Stream 中修改外部变量

Stream 是函数式风格,强调无副作用 ~

int sum = 0; list.stream().forEach(e -> sum += e); // 编译失败

❌ 过度使用 Stream

有些逻辑,用 for 循环更清晰,经验法则是:简单遍历:for;数据转换、过滤、聚合:Stream

❌ 并行流 parallelStream 真的快吗

list.parallelStream().forEach(...)

不一定快,甚至可能更慢。并行流适用于数据量大、无共享状态、CPU 密集型、单次操作耗时较长的场景,而不适合IO 操作、数据量小、有锁 / 有副作用的场景嗷 ~

总结一下下班咯 ~

Stream API不是为了炫技,而是为了让代码更清晰
用得好,它是利器;用不好,就是灾难。

👉 建议:
“能用 Stream 简化的地方用 Stream,不能就老老实实写 for”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 18:22:59

P2MS:比特币的多重签名机制与比特鹰的技术解析

在比特币生态中&#xff0c;P2MS&#xff08;Pay To Multisig&#xff09;是实现资产多人共管的核心技术。通过多重签名机制&#xff0c;P2MS为机构与团队提供了更高的资金安全性。比特鹰将解析其技术逻辑、应用场景及潜在限制。P2MS技术原理&#xff1a;比特鹰的三步拆解 比特…

作者头像 李华
网站建设 2026/6/23 17:14:49

终极AI字幕生成指南:快速掌握智能字幕处理技巧

终极AI字幕生成指南&#xff1a;快速掌握智能字幕处理技巧 【免费下载链接】ComfyUI_SLK_joy_caption_two ComfyUI Node 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_SLK_joy_caption_two ComfyUI字幕生成插件是一款强大的AI工具&#xff0c;能够为图像自动生…

作者头像 李华
网站建设 2026/6/23 10:54:49

C语言程序设计教学指导:突破误区,设计有效实验项目

在编程教育中&#xff0c;C语言教学具有基石地位。它不仅是理解计算机底层逻辑的关键&#xff0c;更是培养学生严谨计算思维的起点。然而&#xff0c;传统的C语言教学常陷入语法细节的泥潭&#xff0c;让学生感到抽象枯燥。有效的教学应超越语法本身&#xff0c;引导学生理解其…

作者头像 李华
网站建设 2026/6/23 18:26:49

DirectX 9.0b SDK介绍:核心组件、在游戏中的重要性

DirectX 9.0b SDK 是微软在2004年发布的一套关键开发工具包&#xff0c;主要用于图形、音频和多媒体程序的开发。它对当时的游戏和多媒体产业产生了深远影响&#xff0c;为开发者提供了稳定且功能丰富的API接口。理解其核心组件和历史地位&#xff0c;有助于我们认识实时图形技…

作者头像 李华
网站建设 2026/6/22 22:31:41

AgentWeb混合开发终极指南:5步实现原生与Web无缝融合

AgentWeb混合开发终极指南&#xff1a;5步实现原生与Web无缝融合 【免费下载链接】AgentWeb AgentWeb is a powerful library based on Android WebView. 项目地址: https://gitcode.com/gh_mirrors/ag/AgentWeb 在移动应用开发中&#xff0c;WebView与原生组件的割裂感…

作者头像 李华
网站建设 2026/6/23 12:39:50

新手如何挖漏洞?看这一篇足够

新手如何挖漏洞&#xff1f;看这一篇足够 新手怎么用黑客技术去挖漏洞&#xff1f;看这一篇就够了。 首先&#xff0c;你得知道真实挖漏洞到底能拿多少钱。拿补天为例&#xff0c;这上面有上万家公司在公开悬赏漏洞&#xff0c;奖金从几十到几千块不等&#xff0c;挖出来的漏洞…

作者头像 李华