[五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用
reduce-归约
看下词典翻译: 好的命名是自解释的 reduce的方法取得就是其中归纳的含义 java8 流相关的操作中,我们把它理解 "累加器",之所以加引号是因为他并不仅仅是加法 他的运算可以是一个Lambda 表达式 所以更准确的说 reduce 是一个迭代运算器 Stream包的文档中其实已经说的很明白了 但是就是因为不是很理解所以看的云里雾里 其中说到: 一个reduce操作(也称为折叠)接受一系列的输入元素,并通过重复应用操作将它们组合成一个简单的结果 参照reduce方法文档给出的示例
T result = identity;
for (T element : this stream)
result = accumulator.apply(result, element)
return result;
累计运算的概念
以下面的这个方法为例解析 BinaryOperator 是BiFunction 的三参数特殊化形式,两个入参和返回结果都是类型T
计算1,2,3,4,5 的和,并且初始值为3 也就是计算3+1+2+3+4+5 |
结果重新作为一个参数,不断地参与到运算之中,直到最后结束 |
Stream的一个参数和两个参数的方法的基本逻辑都是如此 差别仅仅在于一个参数的是result R = T1 ,然后再继续与剩下的元素参与运算 |
三个参数的reduce
U reduce(U identity, BiFunction accumulator, BinaryOperator combiner); 它的形式类似于
与两个参数的reduce不同的地方在于类型 双参数的返回类型为T Stream类型为T 三参数的返回类型为U Stream类型为T 有了更大的发挥空间 T可能为U 也可能不是U |
第一点:identity
的值对于合并运算combiner来说必须是一个恒等式,也就是说对于任意的u, combiner(identity,u) 和u是相同的
这句话看起来怪怪的,对于任意的u 经过合并运算 竟然还是u,那还要这个干嘛??
从我们上面的并行处理流程可以看得出来,这个result 的初始identity 对于每一个分支都是参与运算的! |
场景 假设说4个元素 1,2,3,4 需要运算 此时假设已经 1,2,3 三组数据已经运算结束,马上要同第四组运算 如果是并行,我们假定1,2,3 在一个分支 4单独在另一分支 |
并行时 U为已经计算好的1,2,3后的结果 接下来要与另一组的4 合并 T4则是identity与T参与运算 上面的图就是 combiner.apply(u, accumulator.apply(identity, t)) |
非并行运算 u 直接与下一个元素进行结合运算 |