首页 技术 正文
技术 2022年11月18日
0 收藏 369 点赞 4,004 浏览 2033 个字

reduce-归约

看下词典翻译:[五]java函数式编程归约reduce概念原理 stream 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;

 

累计运算的概念

以下面的这个方法为例解析[五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用BinaryOperator 是BiFunction 的三参数特殊化形式,两个入参和返回结果都是类型T 

计算1,2,3,4,5 的和,并且初始值为3   也就是计算3+1+2+3+4+5 

1.使用Stream 两个参数的reduce方法进行归约运算2.使用for循环迭代调用BinaryOperator 的apply进行运算[五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用其实两种方式背后的思维方式是一样的那就是   

结果重新作为一个参数,不断地参与到运算之中,直到最后结束

 理解reduce的含义重点就在于理解”累   加   器” 的概念[五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用 只要能够理解了累计运算的概念就可以完全理解Stream 中reduce方法他就是一个不断累计运算的过程[五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用  

Stream的一个参数和两个参数的方法的基本逻辑都是如此差别仅仅在于一个参数的是result  R = T1 ,然后再继续与剩下的元素参与运算

  

三个参数的reduce


    <U> U reduce(U identity,                 BiFunction<U, ? super T, U> accumulator,                 BinaryOperator<U> combiner);

 [五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用 它的形式类似于[五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用

与两个参数的reduce不同的地方在于类型双参数的返回类型为T  Stream类型为T三参数的返回类型为U  Stream类型为T   有了更大的发挥空间  T可能为U 也可能不是U 

 很显然,三参数的reduce 方法的思维方式同双参数的并无二致所以问题来了,那还要第三个参数做什么?

其实第三个参数用于在并行计算下 合并各个线程的计算结果 并行流运行时:内部使用了fork-join框架[五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用多线程时,多个线程同时参与运算多个线程执行任务,必然会产生多个结果那么如何将他们进行正确的合并这就是第三个参数的作用

  大致处理流程[五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用从流程上看的 结果R是一直参与运算的!!我们之前也有一个例子两种情况下的结果是不一样的!!!![五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用 [五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用结果不同  是因为  ((((5+1)+2)+3)+4)+5   和   (5+1)+ (5+2)+ (5+3)+ (5+4)+ (5+5)  运算结果不相同  那么这个方法不是有问题么? 其实不然,有问题的是我们的写法文档中进行了明确的说明要求[五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用 翻译下:

第一点:identity 的值对于合并运算combiner来说必须是一个恒等式,也就是说对于任意的u,  combiner(identity,u)  和u是相同的这句话看起来怪怪的,对于任意的u 经过合并运算 竟然还是u,那还要这个干嘛??

从我们上面的并行处理流程可以看得出来,这个result 的初始identity 对于每一个分支都是参与运算的!

 这也是为什么要求:任意的u,  combiner(identity,u)  和u是相同的的原因我们之所以会错,就是因为没有达到要求   我们的combiner为   (a,b)->a+b;那么如果分为两个分支进行运算,我们的初始值identity就参与了两次运算  也就是说多加了两个identity的值!!怎么样才能保证u = combiner(identity,u)   除非identity=0  这才是对于  (a,b)->a+b  来说能够保障u = combiner(identity,u)     否则,你就不要用(a,b)->a+b  这个combiner我们把Identity换成0之后[五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用[五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用 结果就不再有问题了 第二点combiner 必须和accumulator要兼容对于任意的u 和 t[五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用这到底是什么意思呢? 

场景假设说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)) [五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用

 

非并行运算
u 直接与下一个元素进行结合运算

[五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用

 显然这只是并行和非并行两种不同的处理运算方式,他们应该是相同的也就是[五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用  

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,090
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,567
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,415
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,187
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,823
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,906