news 2026/7/16 18:24:15

Stream流式编程 中间操作和终端操作介绍

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Stream流式编程 中间操作和终端操作介绍

一、先立心智模型:Stream 到底是什么?

Stream 不是集合,不存数据,不改数据。

它是:

对数据源的一次性、惰性的、函数式“处理流程描述”

三点必须刻在脑子里:

  1. 惰性执行:中间操作不执行,直到终端操作出现

  2. 流水线模型:元素一个一个穿过全部操作

  3. 一次性消费:终端操作后流关闭

stream.中间操作1().中间操作2().终端操作();

二、Stream 操作的两大阵营

分类作用是否立即执行是否返回 Stream
中间操作描述“怎么处理”❌ 否✅ 是
终端操作触发执行、拿结果✅ 是❌ 否

三、中间操作(Intermediate Operations)

核心作用一句话

中间操作负责“塑形”和“筛选”,不产出结果,只返回新 Stream。


1️⃣ filter:筛选(留下什么)

stream.filter(predicate)

作用:

只让predicate 返回 true 的元素继续往下走

users.stream().filter(u->u.getAge()>=18)

🧠 心法:
永远写“我要什么”,不是“我要丢掉什么”


2️⃣ map:映射(变形)

stream.map(mapper)

作用:

T → R

users.stream().map(User::getName)

注意:

  • 会发生装箱/拆箱

  • 结果是Stream<R>


3️⃣ mapToInt / mapToLong / mapToDouble:数值专用映射

stream.mapToInt(User::getAge)

作用:

转为基本类型流,用于数值计算

好处:

  • 性能更好

  • 可以直接sum / average / max


4️⃣ flatMap:扁平化(降维打击)

stream.flatMap(mapper)

作用:

典型场景:

  • 一对多

  • 集合嵌套

  • SQL 中的 join 思维


5️⃣ distinct:去重

stream.distinct()

基于:

  • equals

  • hashCode

⚠️ 对象必须正确实现这两个方法。


6️⃣ sorted:排序

stream.sorted()stream.sorted(comparator).sorted(Comparator.comparing(User::getAge))

7️⃣ limit / skip:截断与跳过(短路)

.limit(10).skip(5)

作用:

  • limit:最多取 N 个

  • skip:跳过前 N 个

🔥 这是短路操作,会提前终止流水线。


8️⃣ peek:窥视(调试用)

.peek(System.out::println)

⚠️ 不要在peek里写业务逻辑。


四、终端操作(Terminal Operations)

核心作用一句话

终端操作负责“触发执行”和“产出结果”,一旦调用,Stream 关闭。


1️⃣ forEach:消费流

stream.forEach(action)

特点:

  • 无返回值

  • 只做“消费”

⚠️ 不推荐在里面修改外部变量。


2️⃣ collect:收集结果(最重要🔥)

stream.collect(collector)

作用:

把流中的元素收集成你想要的结构

常见:

.toList().toSet().toMap().groupingBy().joining()

3️⃣ reduce:归约(底层思想)

stream.reduce(identity, accumulator)

int sum = nums.stream().reduce(0, Integer::sum);

collect 的思想基础。


4️⃣ count:计数

stream.count()


5️⃣ max / min:极值

stream.max(comparator)

返回:

Optional<T>


6️⃣ findFirst / findAny:查找(短路)

.findFirst() .findAny()

返回 Optional。


7️⃣ anyMatch / allMatch / noneMatch:匹配判断(短路)

.anyMatch() .allMatch() .noneMatch()


五、执行顺序真相(重要)

stream.filter().limit().map().forEach();

❌ 错误理解:

filter 执行完,再执行 limit

✅ 正确理解:

一个元素 → filter → limit → map → forEach

流水线 + 惰性 + 短路。


六、一张表吃透(面试版)

操作类型代表方法特点
筛选filter留下 true
转换map / flatMap变形
排序sorted有状态
截断limit短路
收集collect最常用
判断anyMatch短路
查找findFirst短路
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/15 3:06:29

SpringBoot 实现任意文件在线预览功能

一 文件在线预览在现代工作与生活环境中&#xff0c;文件共享与查看已经成为日常不可或缺的一部分。不过传统的文件处理方式要求用户下载文件到本地后才能查看&#xff0c;这不仅占用了设备的存储空间&#xff0c;还可能导致文件传播效率低下&#xff0c;甚至存在安全隐患。因此…

作者头像 李华
网站建设 2026/7/15 3:50:10

基于CLARK变换和PARK变换的异步电机FOC控制器simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序或模型 4.系统原理简介 4.1 Clark变换&#xff08;三相→两相静止坐标系&#xff09; 4.2 Park变换(两相静止→两相同步旋转坐标系) 4.3 电流环控制 4.4 Park逆变换(d−q→α−β) 4.5 Clark逆变换(α−β→三相) 5.完整工…

作者头像 李华
网站建设 2026/7/15 3:50:08

重组蛋白是什么?从基因到功能蛋白的技术原理解析

在生命科学研究中&#xff0c;蛋白质是执行生物功能的核心分子&#xff0c;而重组蛋白则是科研中最常见、最标准化的蛋白来源之一。所谓重组蛋白&#xff0c;是指通过基因工程手段&#xff0c;将编码目标蛋白的基因导入异源宿主细胞中&#xff0c;由宿主的生物合成体系表达并获…

作者头像 李华
网站建设 2026/7/14 23:40:15

IoT 场景中的 DHCP、ARP、ICMP 到底在干嘛?

&#x1f310; IoT 场景中的 DHCP、ARP、ICMP 到底在干嘛&#xff1f;连上 WiFi ≠ 能通信&#xff0c;真正的网络刚刚开始在 IoT 开发中&#xff0c;你一定见过这些现象&#xff1a; ESP32 显示 WiFi 已连接&#xff0c;但服务器连不上MQTT / HTTP 超时&#xff0c;但 TCP/IP …

作者头像 李华
网站建设 2026/7/16 8:57:17

K8S安装指南与核心操作命令汇总

在云原生时代&#xff0c;Kubernetes&#xff08;简称K8S&#xff09;已成为容器编排的事实标准&#xff0c;无论是企业级应用部署还是个人技术学习&#xff0c;掌握K8S的安装与基础操作都是必备技能。本文将从安装前置准备、具体安装步骤&#xff08;以主流的kubeadm方式为例&…

作者头像 李华