00:00
有结果,那下一波再来个什么呢?下一波这个叫做reduce,叫做规约,对吧,叫reduce规约,这个呢,也稍微的有点特别啊,规约boy test3规约,看这个规约,规约指的是将流中元素说反复结合起来得到一个值啊对吧?说这个规约是什么因思呢?比如说咱们先来个简单一点的,比如来个呃in吧,List等于什么呢?嗯,等于例呃,List list.as例子来的一二三四五六七八九十是这意思吧,那么将来这是我这个集合中的元素吧,我得把集合中所有的元素是不是累加起来计算到总和,对吧?那么就list点上stream,然后去点叫做reduce reduce实际上是不是有这么几个。
01:00
带了对吧,比如说我们说先来一个,第二个就是带俩参数的,对吧,先来第二个带俩参数,第一个它需要一个什么呀,叫做int,这是什么东西,实际上这个呢,它就是实际上就需要一个叫做起始值,因为你是要把它元这个流程跟元素求反复结合起来啊,对吧,那这个时候呢,我们就可以先有一个起始值,起始值比如说是零,后边需要一个什么东西。叫做binary operator吧,对吧?说binary operator是什么来着,叫二元运算,对吧?A a binaryy operator点进去是不是它extends by function呢,对吧,对吧,属于function系列,那么就是PTT,传过去的TTT还义就是传进去T和T,返回值还是T,返回的还是T,对吧?做二元运算呢,对吧,都是T类型,那么二的运算我要怎么来个什么运算呢?说传过去的X和Y,我要运算什么呢?说X加Y的操作,看到吧,最终呢,它会给我得到一个结果,得到一个inte的sum,是不是总和啊,拿到这个总和,我s out一下看看是不是总和,反应输出右键运行是不是是不是对吧?那你说这是它怎么跟反复结合起来,是按照这种形式给我。
02:28
吧,累加操作的呀,对吧,注意这个reduce呢,叫做规约,它是怎么做的呢?它首先呢,这里是不是有个起始值,他把这个起始值先作为了X。听到先把这个零作为了X,然后从这个流中取出了一个元素作为了Y,听到吗?然后呢,实现了X加Y,结果是不是就是一呀,然后呢,他把这个一又作为了X,然后又从流中取出下一个元素又作为了Y,对吧?那刚开始一,然后来个一加上二,那结果就是三对吧?然后呢,再把这个三又作为X,再从这里边取出一个作为Y,那是不是就三加三了呀,把X加Y,那是不是三加三呢呀,变为六,然后是不是再取出一个呀,把六再作为X,四作为Y,那是不是六加四,那就变变成十啊,这样以此类推,反复的结合起来,最终得到一个新纸,反复的按照你这个binary operator的方式就结合呀,最终得到一个新值。
03:37
这能听懂吗?对吧,那么这个叫做reduce,叫做闰月。搞定衡对吧,那么除了这个以外,我说那我现在我就能干什么了呢?比如说我现在呀,想累积算一下当前公司中工资的总和是多少。工资的总和是多少啊?那首先我得先,你们觉得先得干嘛?是以先拿到所有的工资啊,那就因employ.stem先是不是获取礼物了,然后呢,工资那等于用哎map把employee的工资是不是都提取出来啊,Get salary然后再去是不是叫reduce啊?那这次我们用一个参数的reduce是不是计算工资总和啊,工资都是double,那是不是叫double的sum计算一下总和对吧?这个是double中的静态方法吧?Sum是不是double中的静态方法,是不是计算的对吧?三我数计算什么,这里是1.8是不是有的呀?
04:41
是不是1.8出了新方法对吧,对吧?那么这样的话得到一个大塔的总和,注意这一次的reduce返回结果不一样了,它会返回什么呢?哎,返回的optional听懂吗?咱案里边存的是double,那么这个时候是不是就有问题了,为什么上边我用reduce返回的就是some,上边我用的reduce返回的就变成old,这是为什么?那我们说上边这个有可能为空吗?为什么?因为它是无论如何有的起始值啊,这起始值数不能往会高,但是下边这个有起始值啊,没有,没有起始值,但总额是不是有可能会空的,没人有工资,那是不是就所以说人家的欧的思路是什么呢?说一定不为空的,是不是还有原来的呀,对吧?说有可能为空的值,我是不是就给它封装到open中去。
05:42
对吧,可能为空的值才封装到OB中去,那这样的话用这种方式去避免控制针,是不是这个思路啊,对吧,然后再去点get一下右键。运行是不是这是工资总和啊,对吧,对吧,这工资的总和。
06:01
看懂了啊,对吧,那这里是不是就用到了map reduce啊,对吧,实际上这个map reduce呢,在当今的互联网中应用的是非常广泛的,在map和reduce的连接通常称为map reduce模式,因Google、谷歌用它来进行网络搜索而出名,对吧?就是说白了就是当期用大数据,大数据用到map reduce这种模式。就比较常用,对吧?比如说我们就可以利用map reduce搜索一下当前互联网中所有,比如说当前这个论坛中所有文章中某一个热搜词是什么,这是不是就是大数据对吧,对吧,就是当前所有这个近期这个所有这个文章中最热搜的一个词是什么,出现频率最高那个词是什么等等,是不就是大数据啊,比如说你们平时听那个听歌对吧,人家这个播放器是不有的时候就是来个猜你喜欢呢,对吧,对吧,他猜你喜欢这是不是就是大数据啊对吧?到后边你们讲那个,讲那hadoop的时候,里边就会有这个叫map reduce。
07:14
对吧,对吧,Map reduce模式用的还是比较广,先说先用map是不是做个提取呀,Reduce是不是这个规则操作呀,对吧,做一个结果的累加操作,看到吧,对吧,那么这就叫做map reduce模式归于。好了,那么规律的说完了以后呢,最后再来一个这个叫做是不是搜集啊,这个搜集呢,还是比较对吧,强大的对吧,什么结果都能收集,说收集说收集的什么呢?比如说是我想啊收集一下,呃,我要把当前当前公司中所有员工的名字是不是提取出来啊,并把这些名字放到一个集合中,这样的操作常见不常见是很常见的了,对吧,说结果我要把当前工作中所有人的名字提取出来,提取出来以后,我要给它添加到集合当中去。
08:17
对吧,对吧,那这样的操作还是很常见的,我们就来一个employee,首首先是不是得stream啊,然后你就可以点叫做collect,是不是叫搜集,搜集的同时这里是不是需要一个叫做collect,做collect啊,这collect呢,它被称之为叫做搜集器,对吧?它的作用就是说你想按照哪一个什么收集器的方式进行收集,或者说你想按照什么方式进行一个结果的收集操作。是什么对吧?所以你想按照一个什么方式进行一个结果的收集操作,那么我们注意看这个实际上collector啊,它是一个接口,看到了吧,考拉特是不是个接口啊,那么这个时候意味着我们要传实力,是不是得传它对应时间内啊,那么这个时候怎么办呢?注意看人家呀,给我们提供了一个叫做支持connector的一个工具类,叫做connector斯,对吧,它提供了这个使用类,提供了很多静态方法,可以方便的创建常用的收集器实例,类似的操作之前有过没有,Example之前咱们是不是讲那个。
09:31
那叫什么来着,线程时啊,线程时是不是有基拉的工具类,叫做ex在S啊,是不是就加S的对吧,那现在呢,就是一样,你加上S的就是工具类,就用于产生它的实例的对吧,对吧,那里边都是静态方法,可以方很方便的创建它的一个收集器的实例。搞对吧,那么接下来我需要对结果收集,我刚才忘说了,我需要把名字收集一下啊,那我首先我得叫做map,我要把名字提取出来,是不是get name啊,然后点叫collect,是不是收集啊,我要给它收集到绿色中去了,那就来个collect s,点上to list,那么这样的话,他就把所有的名字给我收集到了list中去。
10:24
看了吧,对吧,拿list我们说是不是可以遍利一下啊,那拿list你就可以直接什么list.to print来是不是打印输出一下右键运行取出来没有,是不是取出来了你就可以对比了,原来要是不用这个的话,我们要做一个这么的个操作得怎么办。对吧,你是不是得变绿啊,然后一个一个的去get内,然后是不是去添加呀,最后是不是得来个迭代器或者增强后去迭代一下啊,是吧,那现在就是这样对吧?那有的时候我们说我不想收集到list中啊,我是不是想收集到set中啊,对吧?比如说我们说这里有可能有重复数据,比如说是不是有填七啊对吧,我说我这个里头有重复了,我要给它去重,对吧,我要给它收集到set中去,是不是也有可能对吧?那我们说那就set,那就来一个叫做employees,点上stream,点上map,先提名字叫做get name,在点上要collect收集了,用它collect词点上叫做to set,那么就到中去,对吧,来一个叫set,里边存使string,对吧,Set crl shift or导一下包,然后是不叫。
11:48
that.for each,然后来一个outline右键。运行。是不是就有了对吧?那有同学又想说了,哎,我不想,我那有的时候我想给它搜集到特殊的一些集合中,比如我要搜集到link哈希赛中,我要搜集到link list中是都有可能,对吧?你要说你有特殊的一些数据结构要收集的话,那怎么办呢?那就还是stream点上map,还是比如说以名字为例,Get name,你是要收集到特殊的集合中去啊,那就map点,哎,不是map collect是不是叫collect,然后通过COLLECT4点上叫做to,这里有个collect Co是不是有个collection呢?Collection里头是不是需要一个,是不是供给型产生对象的呀,我们就可以来个哈西set new。
12:49
Ctrl shift o导下包是不是导定,那么这样的话,它就把你放到了这个哈西set中,看到吧,你要是比如说link哈西赛,那是不是就link哈西set new啊对吧,那么就到了link哈西set中。
13:09
搞定了,找a3.oe直接给它打印一下,说想放到什么集合中,你就指定哪个集合就可以搞定,搞定这是不是就收集呀,对吧,这就是对结果的一个收集。没啥感觉是吧,没啥感觉没关系,一点点来,再来什么呢?再来再来还有什么收集的情况,比如说就像面我们之前说的,你是不是那个在C中是不是有大量主函数啊,比如什么max啊,M啊,Come呀,还有什么sum呀,Average是不是这个平均值啊,对吧,是不是都有啊,对吧,那我们说也可以,那比如说来个stream是吧,我们就可以来个叫做collect,我们说要搜集啊,叫做collector,试点上是不是有这么多,比如说叫做counting,这是叫总数,对吧,说结果收集成一个总数,总数的话应该是个long,这是不是叫做总数啊,来个count叫做总数,对吧,总数那么右键。
14:26
运行是不是总数为六对吧,那有总数有总数还能有什么呢?总数有还有。比如说总数,然后呢,比如说来个平均值吧,对吧,来个平均,嗯,平均值也行,说平均值平均值平均值的话,那是不是,比如说算个工资的平均值是多少,是不是可以啊,对吧,叫employs点均上,比如说map是不获取个工资啊对吧,Employee的get salary是不是点叫connect呀,然后他要通过collect词点上叫做average,对吧,注意它是不是有类型转换的,你是要把平行值得到大的,还是得到in的,还是得到long是这意思吧?对吧,那我们是不是要double啊,注意它这个这个平均值不用我提取了,我刚才是不是多了一个map呀,人家是不是这这里指定map了呀,对吧,这里指定了啊,就不用我在那里单独map,我只要在这里头来一个叫做get salary是吧?按工资获取个平均。
15:36
均值啊,这样的话呢,他就会给我得到一个double的平均值,工资的平均值右键运行,有没有是不是工资平均值啊,就比如说再来个总和对吧,是不工资的总啊,那就employees,点上是不是stemam,再去点上collect,然后来个COLLECTOR4点上叫做注意下边这啥啊,Mm ing,这叫suming doubleing in long啊对吧?所你要什么,比如说工资对吧,那是不是叫呃,这个employ employee的salary说工资总和啊,那么这样的话呢,他就给我得到一个这个double的S对吧,工资的总和S,这个时候再去右键运行。
16:36
是工资总和对吧,对吧?所以我这刚才比刚才说多了个填七呀,是不是工资总和啊,还有什么最大值最小值的对吧?最大值那就employees.stream然后来个connect connect点上叫做maxpi,这里是不是需要一个compare啊,对吧?那么这样的话compare的话呢?嗯,那我们就这么来,那就E1和E2吧,是不是这个,然后呢,按照工资比较一个最大的可以吧,但是这样的话我获取的是不是员工啊,获取的员工因为我说没有提取工资对吧?那这次获取的是按照工资比较最大的那个员工信息吧,嗯,那么就double点上compare叫一一.get salary和一二.get salary,注意现在的eclips是不是还没有那。
17:36
它的智能啊,对吧,还没有那么的智能小个括号,对,那这样的话呢,就来一个嗯,Employee是不是叫employee啊,叫做ma是吧?呃,Optional是不是得是optional对吧?Optional的employee对吧?拿到这个employee我就see out,像max.get这是工资最高的employee吧,是不九千九对吧?那假如说我想获取个这个最小值,获取个最小工资呢?那我是不是就得先map映射一下来呀,Map先获取get andary,再去点connect收集,通过connect斯点上me by,然后来个double的compare出口令,对吧?那这个时候得到的就是一个open。
18:36
Double,这里是mean,然后呢,拿到它以后我就是set out in.get对吧,对吧,那这个时候再来一个右键。运行是不是三千三对吧,是不是挺简单的呀,对吧,那这是不是就是一些一系列的那些叫做对应着我们三中的总函数啊,对吧,什么总数平均值总和最大值最小值。
19:10
同对吧,对吧,那这是总函数,那有些同学说了,哎,那光总函数不够啊,说我在算数中我还能分组呢。分组生生是不是能分组啊,之前我们说用那个什么部门各求各个部门的平均工资是多少对吧?各个班级的平均分是多少,就类似于这样的呀,能分组在这里也能知道吧,那我就来一个,比如说我要按照什么分个组呢六对吧,我们说来个叫做分组分组,那么我们说首先先别的不说了,这流是肯定要的对吧?那接下来有什么connect,我要分组啊,我就按照状态分,我这里是不是多一个状态,就有什么free啊,Busy vacation3种状态啊,就按照状态分组可以,那就搜集的时候呢,通过collect点上叫做theing by对吧,然后这里边是不是需要一个function对吧?需要个方,方形中传过去的参数返回的值啊对吧?那我们就说按照什么分组。
20:20
那按照employee get standards stas,按照这种方式分的组,注意分组,你觉得返回值应该是什么?来集合对吧?那当然分组呢,是不是应该返回外呀?KK的话,那是不是就是我按照standards分的组Y6,那是不是得是个例子呢?每个组有多少人呢?是不是有多少个employee啊对吧?那这就是分组看到吗?那拿到这个map我是不是就set out一下啊,注意map不能那啥不能没有each,听懂吧,Map没有for each你是不是得获取它的K或Y流之后再负一次啊,那咱们就别写那么麻烦了。
21:07
便利map大家都会吧,咱们就输出一下看看效果得了,右键运行,注意看是不是分了组了,这是busy对吧?有李四田七对吧,B组,然后然后还有田七,我是不是有两田七啊,注意看再往下这是free组,Free组有张三对吧?有赵六是不是没了呀?然后再往下是不是叫vacation组啊,Vacation这组是王五是不是就王五啊,自己那是不是就分组了呀,对吧?那这就是分组,按照状态分组。是懂吧,那我们同学又说了,所以说说说我在C中不仅能分组,我还能叫做多列分组,我先按部门分,部门一样按照别按照这个按照,比如说ID分,对吧,按照音employ ID分是不是也行啊,对吧?那我们在这里面呢,也有叫做多级分组,是不是该有的都有对吧,叫employee,点上stream对吧,然后呢,再去点上是不collect分组这个这个搜集啊,搜集叫做collectors tos,点上叫做是不groupping by啊大家只需要看第二个就完事了,是不是第二个,第一个需要一个function,第二个参数又需要一个collector,是不是又需要个collector了,那又需要个collector,那我们是不是又可以继续分了,是这意思吧,对吧,那也就意味着你是不可以。
22:49
无限多的组,无限的分下去呀,对吧,那么比如说第一个,第一个呢,我要按照employee get standards分是不?第一个按照先按状态分呢?按状态分完,按什么分是再来collect斯啊,再来collect斯,点上再格BY,你说还可以再无限多分,那么咱们就再来一个的,那先按状态分,按状态分完我们这样吧,按照年龄段分。
23:20
可以吧,比如说这个小于30的,就是30以内的吧,35以内的吧,就叫青年,50 50以内的就叫中年。剩下的是老年。可以吧,就类似这样行吧,那这样的话它需要一个function function的话呢,我们是不是得传过去个employee啊,接下来是不是就得分组了,是这意思吧,对吧,就得分组,分组的话呢,我们说要怎么分来着,是不是得自己这回得自己写了呀,你也可以写类似于是不是提取成状态的这种,但现在咱们媒体写的复杂点呢,就是自己分,那就如果这个e.get age,如果大于嗯,小呃,小于等于多少,小于等于35的话,那么就return应该叫做青年对吧,对。
24:19
他是不是让我强转一下,这个E没有指定类型对吧,是不是指定一个呀,对吧,那就青年,那么再来一个叫做什么呢?那就else if对吧,说如果一点上get age对吧,Age如果是小于等于50的话,那就return叫做中年对吧,然后在else if对吧,就else得了else那就return老年,是这意思吧,他是不是让我强转一下啊,是吧?
25:05
他说没有指定类型啊,那他就让我旋转一下就转一下,那这样的话呢,是不是得到青年中年老年分的组啊,分的组以后呢,这回问返回值应该是啥。这词是多积分的呀,总的肯定是个map map的K是叫做standards y6呢,哎,还是map,这回map的K是street对吧?VALUE6应该是list,绿色从纯employee。可以啊,你们都没乱是不是生的,先按状态分,状态分完这是按叫做年龄段分对吧?那么这个时候我就set out下这个map右键运行是不是有啊,叫vacation组,是不是有青年对吧?青我可以先组中有青年组,青年组中有王五对吧,是不是就没有了对吧?然后呢,这叫做BC组,BC组中有青年组,青年组是不田七啊,然后呢,田七啊,有两个田七对吧?然后呢,这是不是也有老年组啊,老年组是不这样啊,李四啊,然后是不是没有了对吧?然后接下来是不是free free组有青年组有张三,中年组有。
26:28
照六是不是没了这出多积分的呀?先按叫做状态分,状态分按年龄段分是这意思吗?那么这就叫做分组,并且是多级分组。可是同对吧,那么分组有了以后,接下来是什么呢?不仅能分组,还能叫做分片,或者叫分区也行,对吧,叫test。八说分区吧,分区分区说怎么个分区呢?它就可以分two和FALSE2区,满足条件的一个区,不满足条件的一个区,听懂吧,对吧?那就来个叫做employees,点上stream,然后呢,去来个collect,然后通过collect词点上分区,叫做parking by,你是不是也可以多多积分呢?对吧,那不行,咱们就别写那么多了,就按照这个工资分吧,叫做1.getsalarysalary,对吧,要是来个大于。
27:36
嗯,8000吧,对吧,大于8000含义就是满足条件的一个区域,不满足条件的是不是一个区域啊。大于8000,那这样的话呢,是还是map呀,Map的K那是不是就是玻璃了对吧,然后Y6呢,是不是是个list呀,里边存employee对吧,说满足条件的一个区,不满足条件的一个区。
28:10
Force是不是有李四啊对吧?有王五对吧?有赵六对吧?有张三,这啊,这是处是吧?处是不是有张三啊?哎呀,我的又拉没了,是不是两个区啊对吧?处一个区是不是false一个区啊对吧?有两个区是否定对吧?那么这叫分区。对吧,还有一些其他的收集方式啊,咱们都稍微的再试一试,还有什么呢?刚才比如说咱们看到了这么一个东西,叫做employee,点上STEM,在collect的时候呢,通过collector etos点上叫做some some reasonising double是some reasonising it呀,还有long,对吧?然后呢,注意看参数是to double function to in to long function吗?并且返问值是什么呢?返问值什么叫做double sum readinging,什么sta t t呀什么呀,对吧,反正就是挺长的是吧?那这样的话呢,注意看,比如说我按照这个employee啊,Salary给它取一下,对吧,它需要to刀的方式是不是就说白了就是function呢?就是给你的完成的类型转换是不是对吧?然后他给我们返回的值是是不是这个东西,比如说DSS得了是返回这个呀,拿到这个以后,我一看就知道。
29:38
Out dss.get看到了吗?平均值总和max me sum,是不是刚才都有啊?是不是都试过了呀?DSS.get average c dss点上get叫做max,是不是主函数是另外一种获取方式啊?我们发现这些是不是你获取方式有很多种啊,对吧?你用的这种方式也是可以获取。
30:08
看懂了对吧,比如说除了这种你还可以怎么样呢?还还有别的对吧?比如public world test,幺零,那这时来个employee点上,比如说stream,再来一个叫做collect,叫做collect点上,嗯,比如说叫做draw,是不是叫连接呀,对吧?连接什么呢?连接是不是连接字符串啊,连接字符串的话,我就来个map把,呃,姓名是吧,Employee get name是不是连接字符串对吧?那连接字符串最终得到的是不是就是个字符串,拿到字符串之后,我就c out,输出一下字符串,右键运行。有没有说把这个整个所有的名字都连成正串了,那同学说这这字符串都连一块了,我中间想加个逗号,你想加逗号,你就在这加个逗号,右键运行说首尾的还给你去掉了呢,对吧,对吧,你说你说你首尾也想加点别的,为了好看对吧,你就可以再进逗号是吧?杠杠杠对吧,然后再逗号呢,杠杠杠对吧,那这样的话再去右键运行,是不是连接字符串啊对吧,你说想对结果做什么样的收集方式,你自己指定看懂了好了,那么以上呢,就是终止操作,这个叫做叫做规约和收集reduce和collect收集方式,你是不是任意指令啊,通过它指定那个收集器,你想收集成什么结果就收集成什么结果。
31:55
看懂了啊,好了F。
我来说两句