269. Java Stream API - Map-Filter-Reduce算法模型

文章目录

  • [269. Java Stream API - Map-Filter-Reduce算法模型](#269. Java Stream API - Map-Filter-Reduce算法模型)
    • [🧾 示例背景:计算十月销售总额](#🧾 示例背景:计算十月销售总额)
    • [🧮 用传统方式求出十月的销售总额](#🧮 用传统方式求出十月的销售总额)
      • [✅ 输出:](#✅ 输出:)
    • [🧠 拆解这个处理过程:Map - Filter - Reduce](#🧠 拆解这个处理过程:Map - Filter - Reduce)
    • [🚀 使用 Stream API 实现相同逻辑](#🚀 使用 Stream API 实现相同逻辑)
    • [📘 和 SQL 的类比更清晰](#📘 和 SQL 的类比更清晰)
    • [🛠️ 额外练习(可课堂互动)](#🛠️ 额外练习(可课堂互动))
    • [✨ 小结:Map-Filter-Reduce 模型优势](#✨ 小结:Map-Filter-Reduce 模型优势)

269. Java Stream API - Map-Filter-Reduce算法模型

在深入学习 Java Stream API 之前,我们先来了解它背后的经典思想:Map - Filter - Reduce 算法模型

这是一种非常通用且高效的数据处理模式,特别适合用在数据转换、筛选与聚合的场景中 ------ 类似数据库中的查询操作。


🧾 示例背景:计算十月销售总额

我们有一个简单的 Sale 类,记录了某个商品在某一天的销售额。为了代码简洁,我们使用 Java 14+ 引入的 Record 类型来定义它:

java 复制代码
public record Sale(String product, LocalDate date, int amount) {
    // 自动生成构造方法、访问器、equals、hashCode、toString
}

然后我们构造一个销售记录列表:

java 复制代码
List<Sale> sales = List.of(
    new Sale("Orange", LocalDate.of(2022, Month.JANUARY, 2), 4),
    new Sale("Pumpkin", LocalDate.of(2022, Month.OCTOBER, 18), 12),
    new Sale("Butternut", LocalDate.of(2022, Month.OCTOBER, 3), 6),
    new Sale("Apple", LocalDate.of(2022, Month.AUGUST, 28), 3)
);

🧮 用传统方式求出十月的销售总额

java 复制代码
int amountSoldInOctober = 0;
for (Sale sale : sales) {
    if (sale.date().getMonth() == Month.OCTOBER) {  // 筛选条件
        amountSoldInOctober += sale.amount();       // 累加金额
    }
}
System.out.println("Amount sold in October: " + amountSoldInOctober);

✅ 输出:

java 复制代码
Amount sold in October: 18

🧠 拆解这个处理过程:Map - Filter - Reduce

这个例子其实包含了我们处理数据时常见的三步流程:

步骤 名称 动作描述
第一步 Filter 筛选出日期在十月的销售记录
第二步 Map 从每个 Sale 对象中提取出 amount
第三步 Reduce 把所有 amount 相加,得到总销售额

🎯 总结一句话:从集合中找出需要的对象 → 转换成数值 → 聚合为一个结果


🚀 使用 Stream API 实现相同逻辑

java 复制代码
int amountSoldInOctober = sales.stream()
    .filter(sale -> sale.date().getMonth() == Month.OCTOBER)  // Filter
    .mapToInt(Sale::amount)                                   // Map to int
    .sum();                                                   // Reduce

System.out.println("Amount sold in October: " + amountSoldInOctober);

📌 .mapToInt() 是将对象转换成 int 类型流,便于后续的 .sum() 操作。


📘 和 SQL 的类比更清晰

你可以把这段逻辑类比成如下 SQL 查询:

java 复制代码
SELECT SUM(amount)
FROM Sales
WHERE EXTRACT(MONTH FROM date) = 10;

这样学员能快速对照记忆 Stream 的每一步,特别适合有 SQL 背景的同学。


🛠️ 额外练习(可课堂互动)

  1. 计算销售总额大于 5 的记录数量
  2. 统计每个月份的总销售额(用 Collectors.groupingBy
  3. 找出金额最大的销售记录(用 .max()

✨ 小结:Map-Filter-Reduce 模型优势

  • ✅ 结构清晰,便于组合操作
  • ✅ 适用于大多数数据处理任务
  • ✅ 与 SQL 思维接近,上手快
  • ✅ 可与 Lambda 表达式无缝结合,实现函数式风格
相关推荐
xiaoxue..4 小时前
合并两个升序链表 与 合并k个升序链表
java·javascript·数据结构·链表·面试
忧郁的Mr.Li4 小时前
SpringBoot中实现多数据源配置
java·spring boot·后端
啊森要自信4 小时前
CANN ops-cv:AI 硬件端视觉算法推理训练的算子性能调优与实战应用详解
人工智能·算法·cann
玄同7654 小时前
从 0 到 1:用 Python 开发 MCP 工具,让 AI 智能体拥有 “超能力”
开发语言·人工智能·python·agent·ai编程·mcp·trae
yq1982043011564 小时前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践
java·开发语言·前端
一个public的class4 小时前
你在浏览器输入一个网址,到底发生了什么?
java·开发语言·javascript
有位神秘人4 小时前
kotlin与Java中的单例模式总结
java·单例模式·kotlin
golang学习记4 小时前
IntelliJ IDEA 2025.3 重磅发布:K2 模式全面接管 Kotlin —— 告别 K1,性能飙升 40%!
java·kotlin·intellij-idea
小瑞瑞acd4 小时前
【小瑞瑞精讲】卷积神经网络(CNN):从入门到精通,计算机如何“看”懂世界?
人工智能·python·深度学习·神经网络·机器学习
爬山算法4 小时前
Hibernate(89)如何在压力测试中使用Hibernate?
java·压力测试·hibernate