00:00
行,这呢是我们这个第一波,哎,然后呢,我们看一下这个第二波,第二步呢,这个叫映射,哎,CTRLC一下,这里边我们要举例子的话呢,稍微有点难度了啊。诶public,诶avoid一个二。诶CTRLV啊粘过来,诶把这个呢,我们首先注释一下,那这个映射呢,本身这个map的单词呢,就叫映射的意思,诶所以我们这呢就来说它啊说这个map的话呢,它接收一个函数作为这个参数,将元素呢转换成其他形式或者提取信息,该函数会应用到每一个元素上,将其映射成一个新的元素。行,这是这个意思,嗯,先呢,简单举一个例子吧。啊,简单举个例子,比如说哎,我们现在先拿到一个,先拿到一个例子啊,比如我拿这个risk.as list,这里边我写一个A,小写的B。
01:06
DD成out enter,诶生成我们对应的这样的一个list,诶拿到list了,那list点首先stream,接下来我们调map。啊叫map啊叫映射嘛,这个映射的话呢,我们会说啊,它会操作每一个元素的自动呢,它里边会有一个遍历,那每一个元素我们干什么事呢?哎,这呢,你操作string map里边呢,这放的是个函数,函数的那个方法呢,就是放进一个行三返回一个值,哎我们这呢是string,我就写ST2吧,哎,我想让我们的HR呢,变成一个upper case。大写的。那接下来呢,我们再做一个for each。对,就这样的操作。哎,来执行。那这呢,就都变成这个大写了。啊,就是这样的一个意思啊。
02:03
是完了。嗯,说完了就是他其实这个map的话呢,咱们高中学的这个映射,包括咱们讲那个哈希map呀啥的,它不就也叫映射嘛,咱们讲哈西map的映射呢,就是这边是K,按照某种规则呢,对应一个value啊,这叫映射,高中讲的那个话呢,比如是一啊一呢就按照这个平方的关系啊,这还是一二的话呢,这就是四啊,这叫映射,那现在呢,我们这里边放的是这是小A,呃,小B小C呃,映射过来呢,规则是变成大写,哎大A,哎BB,哎,CC啊这个意思啊,哎,这个映射关系是不是你把它当成个自变量,然后这呢,得到的是这个因变量,其实那里边不就是一个函数吗?哎,这个意思啊成,那这呢是它接下来,接下来它这有一个。粒子是吧。说呢,获取员工姓名长度大于三的员工的姓名。啊东西这种脑子不转了啊,再念一遍是吧,获取员工姓名的长度大于三的员工的姓名,就是你像这个里边把这个长度大于三的啊,三的不算,就他俩呗,对比尔盖茨,扎克伯格还是俩行过来咋整?
03:22
啊,你首先得得到我们这个集合啊,Employee data.get employees啊,然后呢。啊。我们先封一下吧,先得到一下我们这个list,然后呢,拿着我们这个employees点先STEM一下,然后呢。哎,点map一下。点map干嘛呀?嗯,点map呢,咱们可以做什么事呢?我先把这个每一个员工,嗯,左边呢,你看我们这个,这里边大家想象的这是不是就每一个employee啊,哎,我通过这种映射呢,我可以先拿到他们的名字,我先拿到名,然后名呢你再看谁大于三,这不就是上面一个filter吗?对,那这块呢,我们先呢拿到他们的名字,那这里边呢,不就是你的员工吗?哎,我呢去get他的name,看这就完了,Get name对吧。
04:24
盖内,诶,我们这个能写成这样不?这不就是我们说的这个方法引用的第三种情况吗?还不对是吧。这就对了。啊,完全处于懵的状态是吧?这个是谁啊,这个就是咱们刚才写的这个方法引用的第三种情况啊,啊对第三种情况,这有没有类似的呀?哎,有那是吧,不就是这种吗。我现在呢,这不正好也是个函数,咱们这块呢该内,我这恰好还就是该内了,诶跑这了跑这了还就他啊。
05:06
不熟,你就写成我们刚才的拉姆达表达式吗?行,我这个就保留了啊,这个首先呢,我们得到这样一个结果,这个结果呢,你看我们先返回一下啊,哎呦是跑这儿来了。Enter,这个先别着急回车啊,掉到这。此时呢,咱们得到的是一个string构成的一个stream。就你这呢,是都是员工,哎,我们映射完以后呢,这块是不是就全是一个一个姓名了,这个姓名这块也是构成了一个stream,就它里边放的都是stream。那接下来其实这个string就不明确啊,其实就是我们的name呗,Names啊,那拿着这个CTRLCCTRLV,它呢,咱们不就要过滤吧,上面过滤呗,这呢都是这个string了,String其实就是内了,哎,我们呢,想看一下这个name.lengths大于三倍。哎,把那个不是三个小A等于三的就都过滤掉,然后你for一下,哎,这不就把这个名字就都满足的保留下来了。
06:07
那以后呢,再做这样的事情,直接在我们Java层面呢,调4VPI就可以。就这两个。行,这是咱们我们说的这样的一个练习啊,嗯,下边一个练习。Flat map function。啊,这个要说说清楚它的话呢,这里举个例子,举个例子的话呢,这应该是我们诶关于stream这块的一个比较难的一个点啊,我们得把这俩的区别呢给大家说清楚,好,这块大家稍微注意一下。这个flight map呢也是一个方程,这也是个方式区别,看它的一个介绍,也是作为一个函数,作为一个参数说,将流中的每个值都换成另一个流,然后呢,把所有的流连成一个流。啊,这个不用问,肯定也懵是吧?啊什么意思呢?这个我先给你类举一个例子啊,方便呢,大家去清楚这个事儿。
07:10
太,我写个三。回忆一下,咱们以前讲集合的时候呢,说过这样一个问题,我这呢来一个list。嗯,不妨呢,就叫integer了啊。行,我这个LIST1啊,里边我艾特一下这个123。好搞定啊,然后接下来呢,我再创建一个a list。这样2456这样好了,咱们通过这个LIST1这个爱的方法有两个。一个方法呢,叫爱的,是这个形式的。啊,这个我写成泛型的了是吧,写成泛型的呢,还不好办了,不好玩了,就啊把泛型的去掉。
08:02
其发型在卡我这个类型了,诶第一种呢,我艾的时候呢是object,我们此时呢,比如说放进去的是。这个例二。这样放的,那这个大家知道结果长啥样吗?几个元素啊,对,四个元素。嗯,看看啊,理解一了。这样的。对,四个元素啊,大家说的这个是对的,这呢是它的这种写法,然后呢,我们这个LIST1,咱们有一个叫at all,这个at all的话呢,我写上这个LI2,对,这就有六个元素了。哎,这个很清楚啊,行,这个清楚以后呢,我们类比过来说这个事儿,这呢叫flat map flat给你压平了是吧,这个呢叫map,嗯,呃,想说的一个事是什么呢?就是呃,如果你这里边还是一个流,它就会把这个整个这个流呢当成是一个元素,而你这里边这个结构,如果要是出现是个瘤,它就会把你这瘤里边这个东西呢,再给你取出来,一个一个取出来,当成是一个大的瘤。
09:18
啊,还不理解,就是这个呢,就类似于我们的这个爱。上面这个map呢,类似于我们这个A。那压呢,就是我们当前这是list,我们一会呢,上面不就是个stream吗?那就是这里边放的,这里边放的如果是一个stream,用map的话呢,那就是stream,是不是又构成了一个stream了。就是你刚才看到说这个集合里边又出现了一个集合了这种了,但是你要用这个at all呢,它就会把你这个STEM呢给你打散了是吧,不让你看做是一个集合了,而是里边就是一个四逗号五逗号六这几个元素给你一个一个的又加到这里边,就是你不会看到说这是里边又包了一个这个了,他把这个给你打开了,就是一个一个的元素,诶这呢就是我们flat map的一个特点啊。
10:06
那这个应该不难理解,关键呢,就是我们通过一个例子呢,把这个事呢给说清楚。把这事给说清楚。稍微耽误大家几分钟吧。哎,来,我们写一个例子啊。嗯,我们public了,嗯,然后呢,我先写成VO了。嗯,这个我们想做的事呢是哎,From stream,哎,To to,我写成一个stream,这个位置呢,我写个string形的一个字符串。想做的事呢,我把这个字符串。把这个字符串呢,我给它打成一个具体的stream了啊,嗯,我我写着你就知道什么意思了,在这里边首先我们造一个list。哎,把这个string里边每一个字符呢,给它看成是一个元素,那瑞呢,就是好几个元素,每一个元素呢,是一个character。哎,这个我们就要个list。
11:01
这样然后呢写个for循环,哎,这个呢,每个元素是一个character c冒号h2.to叉位。诶,这呢就是个数组了,取出这个数组中的每个元素都是一个character,然后把它加到咱们这个list当中。OK吧?啊,就相当于比如我们这个,哎,我写的是小A小A吧,哎,那就意味着我们这个list里边有俩元素啊,一个小A啊,还有逗号,另外一个小A,然后这个位置呢,我们list点我去调个方法叫做stream,哎,我就不让它是一个word了啊直接呢做一个return。这样子啊,Return这个al enter一下啊,出不来,出不来的话,你这块你写个word这样,然后呢,这块再al enter,它就帮我们去改了是吧,那当然你要写也能写啊,这stream里边呢,具体操作不就是这里边的一个character。
12:01
啊,这个方法的一个意思啊,就是将。哎,字符串中的这个字符啊,多个字符。哎,构成的这个集合啊,转换为对应的这个stream的实例啊。啊,这个说完了,说完以后,那回过来咱们不是主要想演示它和我们这个map的一个区别嘛,区别我们看看怎么整啊,嗯,那我们先来这个位置说一下我们这个map的事啊。啊,这是另外的一个练习了。啊,这个叫练习一,这个咱们写成个二,哎嗯,那这块呢,我们还拿上边这个list,因为它里边每一个呢,都是一个字误串,哎,我们拿到这个字符串,把这个每个字符串又往这里边去放,就这意思,现在呢,拿到咱们上面这个list,嗯,它呢先做一个stream方法的调用,然后调一下这个map方法,需要呢放进去一个函数。
13:04
这个map你注意调,咱们说了,它会对这个集合里边每一个元素都进行操作,而每个呢都是一个字符串,我这呢恰好也是个字符串,返回值呢是这个类型的,我就想调这个方法了。啊,这个方法呢,咱们也可以用一下方法引用,大家再熟悉一下啊,方法引用呢,这时候我们是一个非静态的啊,这个我们给大家静态一下,哎,我们就可以用当前这个类啊叫stream API test。这么智能吗?都写出来了是吧,还写了一个M方法调用呗,方法引用是吧?诶果真不一样啊,Idea呢还是挺给力的,嗯,写好了啊,那这个时候呢,我封一下啊。封一下,这时候大家你注意,咱们调了一个方法,返回的是不是一个stream啊,这时候你看别迷糊啊,我这里边每一个元素呢,是一个字符串,这一个元素呢,就返回一个stream,我这是不是有好几个字符串,本身一个字符串呢,像咱们上边返回的就是个stream放在字符串,现在呢,你stream里边不是stream了,是又是一个stream。
14:12
相当于是stream构成的一个stream,你要觉得这这有点难,那你就al enter1出来又跑这了点,下面这个你看。这不就是stream构成的一个stream?啊,我知道你有点晕啊,不用去深究里边这个事儿,你要听的有点迷糊的话啊,这个我们还是看下边这个事儿,现在呢,这里边儿其实呢,它就像什么呢,像咱们刚才做的这个事儿一样。你这不就相当于集合里边有个集合吗?咱们这就是stream里边有个stream,那如果说你要是便利,咱们要想变利的时候呢,把这个123逗号这种456,你想人家便利的时候,不想让他看到这个,就想看到456,相当于是外边写一层for。
15:03
找到每一个的时候呢?又是一个集合,是不是又一层for?得两层for才可以找到具体每一个元素啊,那现在的话呢,它也类似,比如说咱们现在呢,就想看一下它这里边儿的这个元素啊,一个一个的character呢,让我们拿到,那我们写起来就有点悲壮了。拿到它,咱们想做一个for。但是很遗憾呢,你里边拿到的它又是一个dream。那这个怎么整呢?嗯,这个呢,你先写一个呃,Stream s,然后呢,它指向一下,哎,这个我们这里边儿,它里边呢,又是一个stream是吧。再S点一下。啊,再FOR1是吧,再for each呢,我们这样写system。哎哎,做一个print。
16:01
有点类似于相当于是一个for循环的嵌套一样,这就一层便利。这一层便利。执行一下看看啊,这来一个换行。你看这呢,就我们拿到里边的具体的一个一个的元素了,哎,就是我们用这个map要做的话呢,有点悲壮啊,但是你看我们要用这个Fla map去做它就比较简单了,比如我们拿到这个list子点,哎这个先调一下这个stream方法在点,哎,刚才呢,咱们调的是map,相当于是一个stream构成的这个stream。那现在呢?我们叫flat脉吧。哎,掉它啊掉它呢,里边我们写的还是它。诶,CTRLC一下CTRLV,然后我们alt enter拿这个返回值,你看此时的话呢,它就直接把我们里边这个S给它打开了,我就拿到你里边一个一个的里边的一个元素,所以呢,直接就是character。
17:00
啊,这个就比较简单了,直接拿到它,第二咱们做FOR1呢,你就一层便利就OK。哎,这个我们在这个位置,你也可以换一下行啊这样啊。诶,你看这不是也是一样吗?那很显然的话呢,我们,呃,下边这种方式呢,就是对于这种集合里边套集合的方式,你要想便利每一个具体元素,那优先呢,用flat map上面这个你要写的也行,那自己写起来就比较悲壮一些,哎,就是相当于你得自己写这种for里边嵌套for一样来操作了。成这呢,就是咱们说的这个第二波这个叫映射这样一个操作啊,那为什么我这块把这个讲了讲呢,呃,学大数据的同学呢,可能多少应该听过。啊,大数据里边有个技术叫map reduce是吧?啊map reduce呢是先map后reduce,这个map呢,就像我这里边map叫映射,Reduce呢叫规约,这个规约呢是咱们后边要讲的这个。
18:07
诶,终止操作,这不有个规律叫reduce嘛,哎,Map reduce啊,就是通过这样的一个模式来命名的啊,那么这个map操作就相当于是一个映射操作。啊,就这样。
我来说两句