reduce操作

转载:https://blog.youkuaiyun.com/qq_28660653/article/details/82530011?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-4.base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-4.base

 

再看reduce的用法。reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
比方说对一个序列求和,就可以用reduce实现:

>>> from functools import reduce
>>> def add(x, y):
...     return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25
 

### Reduce 操作简介 `reduce` 是一种常见的函数式编程工具,它用于将集合中的元素通过某种规则累积成单一的结果。在 Java Stream API 中,`reduce` 方法可以对流中的数据项依次应用二元运算符(Binary Operator),从而逐步缩减为单个值。 #### 主要用途: - **累加求和**:例如计算列表中所有数字的总和。 - **字符串连接**:比如把一系列单词组合成一句话。 - **最大最小值查找**:从一组数值找出最高分或最低价格等极端情况下的记录。 对于空的数据源,默认情况下 `reduce` 可能会抛出异常;为了避免这种情况发生,通常我们会提供一个初始值作为参数传入给 reduce 方法。当有明确起始点时,这有助于简化边界条件处理,并使得某些类型的聚合更容易表达。 #### 基本语法形式 ```java Optional<T> reduce(BinaryOperator<T> accumulator); T reduce(T identity, BinaryOperator<T> accumulator); <U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner); ``` 其中最常用的版本是带有一个标识(identity) 和积累器(accumulator)两个参数的形式: - **identity**: 累积过程开始之前的默认值。 - **accumulator**: 定义了如何合并当前结果与下一个元素之间的逻辑。 例子说明: 假设我们有一组整数 [1, 2, 3] 并希望通过它们构建一个新的列表 [6], 表示这三个数字相加之和,则可以用如下的代码片段来表示: ```java List<Integer> numbers = Arrays.asList(1, 2, 3); int sumOfNumbers = numbers.stream().reduce(0, Integer::sum); // 第一个参数 '0' 即为identity System.out.println(sumOfNumbers); // 输出结果应为 6 ``` 这里 `Integer::sum` 相当于 `(a,b)-> a+b`, 是指定了怎样“累计”各个项目的规则——即将前后的两项相加以得到新的中间结果直至遍历完整个序列为止。 而当我们需要更复杂的场景下工作,比如说同时统计正负数的数量、平均值等情况时就可以考虑使用第三个重载版本来进行并行化支持以及自定义类型转换等功能. --- 针对您提到的例子,在那个特定上下文中使用的 `reduce` 具体是用来将多个 `CompletableFuture<ResultWrapper>` 合并起来。它的作用是对每一个未来的响应进行两两对比,只要发现任何一个失败的任务就立刻返回这个错误信息而不继续等待其他待定的操作完成了再做决策。因此可以说这里的 `reduce` 正是在实现一种短路机制(short-circuiting),一旦满足终止条件就会马上给出反馈。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值