map-filter-reduce 算法在 Java 中的实现

文章目录

    • map-filter-reduce 算法
    • map-filter-reduce 算法的简单案例
    • 使用 stream 流实现 map-filter-reduce 算法
    • 为什么不用 Collection 接口实现map-filter-reduce算法

map-filter-reduce 算法

map-filter-reduce 是处理数据的非常经典的算法(也是一种常用于集合处理的编程范式),可以在函数式编程中高效地对集合进行转换和处理。它主要包含三个步骤:

  • 映射(map):将流中的每个元素应用一个函数,转换为新的元素
  • 过滤(filter):根据条件筛选流中的元素,保留满足条件的元素
  • 归约(reduce):通过累加器将流中的元素合并为一个单一的结果

map-filter-reduce 算法的简单案例

首先介绍一下 Java 官网提供的案例,让我们举个例子,假设您有一组Sale对象,它具有三个属性:日期、产品引用和金额。

public class Sale {private String product;private LocalDate date;private int amount;// constructors, getters, setters// equals, hashCode, toString
}

假设您需要计算3月份的销售总额。您可能会编写以下代码:

List<Sale> sales = ...; // this is the list of all the sales
int amountSoldInMarch = 0;
for (Sale sale: sales) {if (sale.getDate().getMonth() == Month.MARCH) {amountSoldInMarch += sale.getAmount();}
}
System.out.println("Amount sold in March: " + amountSoldInMarch);

上述代码的操作可以分为以下三步:

  1. 映射(Map): 使用 map 操作将销售记录映射为其销售金额。
  2. 过滤(Filter):使用 filter 操作筛选出满足条件的销售记录,即在三月份的销售记录。
  3. 归约(Reduce):使用 sum 操作对销售金额进行归约,计算出在三月份的销售金额总和。类似于SQL语言里面的 aggregation 操作

SQL语言在以可读的方式表达这种处理方面做得非常好

select sum(amount)
from Sales
where extract(month from date) = 3;

可以看到,在SQL中,您正在编写的是对您需要的结果的描述:3月份所有销售额的总和。您的数据库服务器有责任弄清楚如何有效地计算该结果。然而, 计算销售总额的上述 Java 代码片段是对如何计算销售总额的逐步描述。它以命令式的方式进行了精确描述。它几乎没有为Java运行时优化此计算留下空间。

使用 stream 流实现 map-filter-reduce 算法

因此, 我们需要引入 Stream API 。 Stream API的两个目标是

  • 能够创建更具可读性和表现力的代码
  • 为Java运行时提供一些回旋余地来优化计算

为什么不用 Collection 接口实现map-filter-reduce算法

另外, Processing Data in Memory Using the Stream API - Dev.java网站里面介绍了为什么不直接利用Collction 接口实现map-filter-reduce算法的原因: 创建不必要的中间结构,对内存和CPU都有很高的开销。

Stream 接口避免创建中间结构来存储映射或过滤的对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/44343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

教师管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;教师管理&#xff0c;个人认证管理&#xff0c;课程信息管理&#xff0c;课堂记录管理&#xff0c;课堂统计管理&#xff0c;留言板管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;课程信息…

Postman使用教程【项目实战】

目录 引言软件下载及安装项目开发流程1. 创建项目2. 创建集合(理解为&#xff1a;功能模块)3. 设置环境变量&#xff0c;4. 创建请求5. 测试脚本6. 响应分析7. 共享与协作 结语 引言 Postman 是一款功能强大的 API 开发工具&#xff0c;它可以帮助开发者测试、开发和调试 API。…

java项目总结数据库

1.什么是数据库 用于存储和管理数据的仓库 2.数据库的特点 1.持久化存储数据。确实数据库就是一个文件系统。 2.便于存储和管理数据 3.使用统一的方式操作数据库 --SQL 3.MqSql服务启动 4.登录和退出 这里的ip值IP地址 5.客户端与服务器关系 6.目录结构 7.SQL 1.什么是SQL&…

节点流与处理流:深入解析Java中的IO流

节点流与处理流&#xff1a;深入解析Java中的IO流 1、节点流&#xff08;Node Stream&#xff09;1.1 定义1.2 好处1.3 示例 2、处理流&#xff08;Processing Stream&#xff09;2.1 定义2.2 好处2.3 创建特征2.4 示例 3、总结 &#x1f496;The Begin&#x1f496;点点关注&…

Linux实现CPU物理隔离

文章目录 背景使用 taskset 命令使用 cgroups案例 背景 在 Linux 上实现 CPU 的物理隔离&#xff08;也称为 CPU 隔离或 CPU pinning&#xff09;&#xff0c;可以通过将特定的任务或进程绑定到特定的 CPU 核心来实现。这可以提高系统性能&#xff0c;尤其是在需要实时响应的应…

Poincaré图和SD2计算参考

在Poincar图分析中&#xff0c;SD2代表心率变异性的长期变化&#xff0c;它测量NN间期数据点沿着Poincar图主对角线方向的分散程度。SD2描述了NN间期的整体波动&#xff0c;通常更多地关联于自主神经系统的调节和生理应激反应。 如何计算 Poincar SD2 Poincar图将每个心跳间期…

JavaWeb__正则表达式

目录 1. 正则表达式简介2. 正则表达式体验2.1 验证2.2 匹配2.3 替换2.4 全文查找2.5 忽略大小写2.6 元字符使用2.7 字符集合的使用2.8 常用正则表达式 1. 正则表达式简介 正则表达式是描述字符模式的对象。正则表达式用于对字符串模式匹配及检索替换&#xff0c;是对字符串执行…

MYSQL 四、mysql进阶 8(索引优化与查询优化)

都有哪些维度可以进行数据库调优&#xff1f;简言之&#xff1a; 索引失效、没有充分利用到索引——建立索引关联查询太多JOIN&#xff08;设计缺陷或不得已的需求&#xff09;——SQL优化服务器调优及各个参数设置&#xff08;缓冲、线程数等&#xff09;——调整my.cnf数据过…

Linux io_uring

io_uring是Linux 内核提供的用于处理大量并发 I/O 事件的机制&#xff0c;在性能上优于epoll。 主要优势有&#xff1a; &#xff08;1&#xff09;无锁设计&#xff1a; io_uring&#xff1a;提供了无锁的用户空间和内核空间通信机制&#xff0c;这意味着在高并发场景下&am…

Linux C++ 047-设计模式之责任链模式

Linux C 047-设计模式之责任链模式 本节关键字&#xff1a;Linux、C、设计模式、责任链模式 相关库函数&#xff1a; 简介 责任链模式是面向对象中的一种软件设计模式&#xff0c;它包含了一些命令对象和一些处理对象&#xff0c;每个处理对象决定它能处理那些命令对象&…

C++中各类常用算法的总结以及使用

1.常用算法 文章目录 1.常用算法1.常用遍历算法1.for_each2.transform 2.常用查找算法1. find2. find_if3. adjacent_find4. binary_search5. count6. count_if 3.常用排序算法1. sort2. random_shuffle3. merge4. reverse 4.常用拷贝和替换算法1. copy2. replace3. replace_if…

如何在Vue中实现拖拽功能?

Vue.js是一款流行的JavaScript框架&#xff0c;用于构建用户界面。其中一个常见的需求是在Vue中实现拖拽功能&#xff0c;让用户可以通过拖拽元素来进行交互。今天&#xff0c;我们就来学习如何在Vue中实现这一功能。 首先&#xff0c;我们需要明白拖拽功能的基本原理&#xf…

一元非线性回归+多元线性回归

一元非线性回归 观察散点图&#xff0c;确定非线性形式&#xff0c;然后将非线性转化为线性求解。 常见的六类曲线&#xff1a; &#xff08;1&#xff09;双曲函数曲线 { y ^ x a b x y ^ a b x x y ^ 1 a b x \begin{cases} \hat{y}\frac{x}{abx}\\ \hat{y}\frac{abx…

【selenium】元素等待

【selenium】元素等待 1、三种元素等待的区别2、sleep等待3、隐式等待4、显示等待4.1 WebDriverWait类4.2 expected_conditions类 1、三种元素等待的区别 特点sleep隐式等待显示等待原理不论网页/元素是否加载完成&#xff0c;都会强制等待x秒设置一个等待时间&#xff0c;等待…

Java 修改微信公众号后台服务器地址URL后,微信公众平台客服功能接收不到用户发送的消息的解决办法

解决办法&#xff1a; 检查一下微信回调URL是否转发了客服消息。 /*** 处理具体的回调信息*/ PostMapping("/callback") public void callback(RequestParam(name "signature", required false) String signature,RequestParam(name "timestamp&q…

centos系统查找mysql的配置文件位置

执行命令查找mysql的安装目录&#xff1a; which mysql cd进入mysql的安装目录 cd /usr/bin 查找配置文件位置 ./mysql --help | grep "my.cnf" 定位配置文件 cd /etc 查找命令还可以用find命令 find / -name "my.cnf"

iOS UITableView自带滑动手势和父视图添加滑动手势冲突响应机制探索

场景 我们有时候会遇到这样的一个交互场景&#xff1a;我们有一个UITableView 放在一个弹窗中&#xff0c;这个弹窗可以通过滑动进行展示和消失&#xff08;跟手滑动的方式&#xff09;&#xff0c;然后这个UITableView放在弹窗中&#xff0c;并且可以滚动&#xff0c;展示一些…

用微信服务号支付门诊缴费

时间上午10刚过&#xff0c;医院里计价收费处排起了长龙&#xff0c;放眼望去&#xff0c;左边的窗口六条队。右边在原来发药的位置也开辟了收费窗口&#xff0c;数了一下有四条队。一共十条排队付费的长龙&#xff0c;每一条队伍的人数不下20人&#xff0c;也即超过200人在排队…

百度智能云将大模型引入网络故障定位的智能运维实践

物理网络中&#xff0c;某个设备发生故障&#xff0c;可能会引起一系列指标异常的告警。如何在短时间内从这些告警信息中找到真正的故障原因&#xff0c;犹如大海捞针&#xff0c;对于运维团队是一件很有挑战的事情。 在长期的物理网络运维工作建设中&#xff0c;百度智能云通…

【linux】linux的特殊符号

特殊字符用途示例,参数分隔符或命令分隔符git log --prettyformat:"%h,%an,%ar,%s"/文件路径分隔符&#xff0c;根目录cd /home/user/documents\转义字符&#xff0c;行继续echo "This is a long command \定义字符串&#xff0c;不解析变量和转义字符echo Hell…