news 2026/3/28 3:27:57

270. Java Stream API - 从“怎么做”转向“要什么结果”:声明式编程的优势

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
270. Java Stream API - 从“怎么做”转向“要什么结果”:声明式编程的优势

文章目录

    • 270. Java Stream API - 从“怎么做”转向“要什么结果”:声明式编程的优势
      • 🎯 目标任务
      • 🧱 传统命令式写法(Java 代码)
      • 💡 思维实验:如果 Collection 有 map 和 filter 会怎样?
      • ❌ 性能陷阱:中间集合的隐性开销
    • ✅ 为什么是 Stream,而不是 Collection?
      • 🌊 Stream 的关键特性:**不存储数据,只描述处理过程**
      • 🧠 懒加载(Lazy Evaluation):终端操作才“开水龙头”
      • ⚙️ 示例:短路操作节省时间
    • 📊 总结:为什么 map/filter 不属于 Collection 接口?
    • 🧵 Stream API 的流水线模型:终端操作才“触发机器运转”
    • 📘 实操建议(练习题):

270. Java Stream API - 从“怎么做”转向“要什么结果”:声明式编程的优势

🎯 目标任务

我们要计算一个城市列表中,人口超过 10 万的城市总人口数


🧱 传统命令式写法(Java 代码)

recordCity(intpopulation){}List<City>cities=List.of(newCity(100_000),newCity(200_000),newCity(500_000));intsum=0;for(Citycity:cities){intpopulation=city.population();if(population>100_000){sum+=population;}}System.out.println("Sum = "+sum);// 输出:700000

这段代码很好地完成了目标,但是命令式的——一步一步告诉程序要做什么。


💡 思维实验:如果 Collection 有 map 和 filter 会怎样?

假设我们扩展Collection接口,给它添加map()filter()方法,并且它们返回的是Collection

Collection<Integer>populations=cities.map(city->city.population());Collection<Integer>filteredPopulations=populations.filter(p->p>100_000);intsum=filteredPopulations.sum();

看起来很“链式”,很优雅,但有一个严重问题每一步都要创建中间集合!


❌ 性能陷阱:中间集合的隐性开销

  • map()会遍历所有城市,并创建一个新的集合保存每个城市的人口数。
  • filter()会再遍历这个人口集合,选出符合条件的。
  • sum()会再遍历过滤结果做加总。

👉 如果处理上百万城市对象,那么这会造成大量内存分配和垃圾回收压力

而传统的for循环是一边遍历、一边判断、一边累加的,没有任何中间结构的创建


✅ 为什么是 Stream,而不是 Collection?

🌊 Stream 的关键特性:不存储数据,只描述处理过程

intsum=cities.stream().mapToInt(City::getPopulation)// 先映射成人口数.filter(p->p>100_000)// 筛选出人口超 10 万的.sum();// 聚合求和(终端操作)

在这段代码中:

  • 没有中间集合产生;
  • .mapToInt().filter()都是中间操作,只是“排管道”;
  • .sum()终端操作,才真正触发数据流动和计算。

🧠 懒加载(Lazy Evaluation):终端操作才“开水龙头”

  • Stream就像“工厂流水线”,每个操作(map/filter)都是一个加工环节;
  • 只有当你调用.sum().collect()等终端操作时,才真的开始处理每个数据;
  • 每个数据只“走一次管道”:

💡 不是“先映射完所有人口” ➝ “再筛选” ➝ “再加总”,
而是:每个城市 ➝ 映射 ➝ 判断是否保留 ➝ 累加(即一条龙服务🚀)。


⚙️ 示例:短路操作节省时间

需求:判断是否存在人口超过 100_000 的城市

传统 Collection 风格必须遍历:

booleanexists=cities.map(City::population).filter(p->p>100_000).anyMatch(p->true);// 已经浪费了两步处理

而用 Stream 可以做到只看第一个符合条件的城市

booleanexists=cities.stream().anyMatch(c->c.getPopulation()>100_000);

💥 一旦遇到满足条件的城市,就立即返回true,后续不再处理!


📊 总结:为什么 map/filter 不属于 Collection 接口?

方式map/filter 返回类型是否创建中间集合是否惰性求值是否支持短路
Collection.map()Collection✅ 会创建❌ 否❌ 否
Stream.map()Stream❌ 不创建✅ 是✅ 是(如 anyMatch)

👉 正因为Collection 是数据容器,而Stream 是操作流水线,所以map()filter()被设计在Stream而非Collection


🧵 Stream API 的流水线模型:终端操作才“触发机器运转”

操作类型举例描述
中间操作map(),filter(),sorted()返回 Stream,不触发计算
终端操作sum(),collect(),forEach()返回非 Stream,触发计算

📘 实操建议(练习题):

  1. 使用stream()实现:计算人口超过 200_000 城市的平均人口;
  2. 统计有多少个城市符合人口 > 100_000;
  3. 判断是否所有城市人口都 > 50_000。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/22 5:06:42

行为树设计陷阱曝光:为什么你的AI总是反应迟缓?

第一章&#xff1a;行为树设计陷阱曝光&#xff1a;为什么你的AI总是反应迟钝&#xff1f;在游戏AI或机器人决策系统中&#xff0c;行为树&#xff08;Behavior Tree&#xff09;因其模块化和可读性强而广受欢迎。然而&#xff0c;许多开发者在实际应用中发现&#xff0c;AI的反…

作者头像 李华
网站建设 2026/3/20 6:45:56

基于微信小程序的志愿者服务平台管理系统(源码+lw+部署文档+讲解等)

课题介绍本课题聚焦志愿者服务供需匹配低效、活动管理流程繁琐的痛点&#xff0c;设计实现基于微信小程序的志愿者服务平台管理系统。依托微信小程序轻量化、高触达的特性&#xff0c;为志愿者、服务机构及管理员提供全流程线上管理服务。系统后端搭建稳定的数据管理架构&#…

作者头像 李华
网站建设 2026/3/15 20:12:04

AI销售工具VertGrow AI销冠助力企业效能提升的获客软件全解

AI销售工具如何优化企业获客流程在当今竞争激烈的市场中&#xff0c;企业获客面临诸多挑战&#xff0c;传统的手段往往无法满足快速变化的需求。借助AI销售工具&#xff0c;如VertGrow AI销冠&#xff0c;企业能够实现更高效的获客流程。通过融合先进的智能获客系统与销售软件功…

作者头像 李华
网站建设 2026/3/27 1:58:33

[ACM]2026年大数据应用与信息化教育国际学术会议 (ICBDIE 2026)

重要信息 大会时间&#xff1a;2026年2月6日-2月8日 大会地点&#xff1a;中国-北京(可参会) 一轮报名/截稿&#xff1a;2025年12月30日 最终报名/截稿&#xff1a;2026-02-05 00:00:00 接受/拒稿通知&#xff1a;投稿后5-10个工作日 检索&#xff1a;EI Compendex / SCO…

作者头像 李华
网站建设 2026/3/27 17:40:19

9000 万身价登顶,皇马失宠之谜

在最新一次德转身价更新中&#xff0c;20岁的居莱尔身价暴涨3000万欧元&#xff0c;达到惊人的9000万欧元。这个数字让他一举成为土耳其足球历史上身价最高的球员&#xff0c;甚至超过了六支西甲球队的阵容总身价。但戏剧性的是&#xff0c;就在身价登顶的同时&#xff0c;这位…

作者头像 李华
网站建设 2026/3/15 13:37:30

6、Nagios监控系统的深入解析与使用指南

Nagios监控系统的深入解析与使用指南 1. 通知配置与过滤 在Nagios中,每个联系人定义除了包含联系人姓名和电子邮件地址等基本信息外,还可以设置主机通知选项和服务通知选项。这些选项能让你过滤单个联系人接收的通知类型。例如,程序员可能只希望收到其负责应用程序的问题通…

作者头像 李华