reduce

文章讲述了JavaStreamAPI中的reduce方法,用于流中元素的聚合,包括基本求和、初始值设置,以及处理不同类型元素的累加问题,如字符串长度求和。讨论了并行计算时如何处理累加器和合并函数。

stream.reduce,流的聚合操作,将流中的元素组合为一个值,可以用与求和、求积、字符串追加、求最大值、最小值、并集、交集。

Stream<Integer> values = ...;
Optional<Integer> sum = values.reduce((x, y) -> x + y);
// 可以用下面来代替
Optional<Integer> sum = values.reduce(Integer :: sum);

在这个例子中,聚合方法会计算v0 + v1 + v2 + …,其中vi表示流中的元素。如果流为空,就无法产生有效的结果,那么该方法就会返回一个Optional值。

通常会加一个初始值0,这样就有了聚合操作的另一种形式:

Integer sum = values.reduce(0, (x, y) -> x + y);

这样流返回为空时,就不需要Optional处理了。

假如有一个包含多个对象的流,并且希望对他们某个属性进行求和,例如求一个流中所有字符串的总长度。这样不能使用简单的聚合操作了,因为他需要一个函数 (T, T) -> T,其中参数和结果要求是一致的,但是当前这两个类型是不一样的,流中元素的类型时String,但是累加的结果是整型,这种情况使用另一个种聚合操作。

首先提供一个累加器函数 (total, word) -> total + word.length(),该函数会被重复使用,形成累加值。但是当并行计算时,会产生多个累加值,因此需要将他们再累加起来,为了做到这一点,需要提供第二个函数:(total1, total2) -> total1 + total2,这样完整的函数如下:

int result = words.reduce(0, (total, word) -> total + word.length(), (total1, total2) -> total1 + total2);
04-09
### Reduce 的概念与用法 在编程和数据处理领域,`Reduce` 是一种重要的函数式编程工具,通常用于聚合操作。它通过反复应用某个二元函数(即接受两个参数并返回单一结果的函数),将一组输入值逐步缩减为单个输出值。 #### MapReduce 中的 Reduce 阶段 在分布式计算框架 `MapReduce` 中,`Reduce` 被定义为接收来自多个映射器(mappers)的结果,并对其进行汇总的过程[^1]。具体来说,在日志分析场景下,`map` 函数会生成键值对 `<url, 1>` 表示每次访问某 URL 的记录;随后,`reduce` 函数负责统计相同 URL 的总次数,最终输出形如 `<url, total count>` 的结果[^2]。 以下是 Python 实现的一个简单例子来展示 reduce 如何工作: ```python from functools import reduce # 假设我们有一系列数值列表 numbers = [1, 2, 3, 4] # 使用 lambda 定义求和逻辑作为 reduce 的回调函数 sum_result = reduce(lambda x, y: x + y, numbers) print(sum_result) # 输出应为 10 ``` 此代码片段展示了如何利用内置库中的 `functools.reduce()` 方法完成累加运算。这里的关键在于传入了一个匿名函数 (`lambda`) 来指定每一步的操作规则——即将当前累积值与下一个待处理项相加。 #### 循环对比 Reduce 尽管可以通过显式的循环结构实现类似的聚集功能,但采用高阶函数形式往往更加简洁明了[^3]。例如下面两种方式均能达成相同的计数目的: 基于传统迭代版本: ```python count = 0 for num in numbers: count += num print(count) ``` 而借助于 reduce 则显得更为紧凑高效: ```python total_count = reduce((lambda acc, val: acc + val), numbers, 0) print(total_count) ``` 上述两段程序虽然语法不同,但实际上执行的是完全一致的任务:遍历整个数组并将其中各元素逐一加入到初始状态之中去形成最后的整体数量度量标准。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值