00:00
来看一下这个代码这个的,呃,它的映射操作是什么呢?这样子的,上面的提出问题其实就是一个关于集合元素映射操作的问题,在SC中,在SC中可以直接通过脉搏映射来解决问题,即什么呢?将集合中的每一个元素通过指定的功能,这个指定的功能就是。函数函数我们刚才讲过,函数其实就是一系列代码完成一个功能的集合,所以说指定的功能映射,映射就是转换。成新的集合。这里其实就是一个所谓将函数作为参数传入到另外一个函数的这么一个知识点及函数式编程的特点。那这个地方呢,我们要用到一点函数式编程的东西了,好,那现在呢,我们以一个啊,对哈希塞映射的一个案例为例,做一个简单的描述,那么我们看看麦普函数的一个原型,或者是它的一个签名是什么。
01:06
这是它的一个map函数的一个签名。啊,签名就是它的一个,呃,一个头,这个函数是长什么德行呢,它是这样子的,Map的名字,它叫map后面有一个这个东西。这个东西就代表它可以接收一个函数,也就是说,呃,这个map。这个B是它的一个泛型。啊,泛型呢,后面我们有一个专门的章节,大家先知道这是一个泛型就可以了。而后面这个F冒号,这个这个地方这一系列这个是什么呢?这是一个呃函数,就是我可以接收一个函数,这边是它返回的一个值,好,你看我这写的是map,映射函数集合类型都有,B是泛型map在这里是个什么呢?就这个map是个什么函数呢?它是高阶函数。何为高阶函数呢?我简单说一下,就是可以接收一个函数的函数,我们称之为高阶函数。先简单写到这儿,待会儿我有案例啊,不要着急,这儿可以接收。
02:13
接收一个函数的函数就是就是高阶函数。那么这里我就可以接收一个函数,那么我这个接收的函数是什么样子呢?就是可以传入一个值,传入一个值,这个值的类型是一个泛型,就什么类型都可以,你指定是什么类型,我就是什么类型,我还可以返回一个值,返回一个值呢,也是泛型指定的,所以说这是这么一个东西,好,基本就说完了啊,那现在呢,为了让大家有有个体验,我们先对高阶函数的一个使用,我举了两个案例来给大家,先把这个高阶函数的基本使用做一个简单的介绍。好,同学们,我先补一点东西啊,后面我们还有专门的章节,那现在呢,为了让大家把这个高级函数有一个相对来说比较,呃,比较形象的一个认识呢,我举两个案例,叫高阶函数的案例,嗨。
03:11
HIG。Hi,这个单词是。High order。就是高阶,高阶这个函数的一个使用fun demo01好,同学们,我先写到这里啊,还order。好,那现在这个案例我怎么举的呢?非常的简单啊,非常的简单,那么因为这段代码特别简单,我已经准备好了,我就直接拿来给大家用一把就OK了啊,这这个地方我就不去专专写了啊呃,我来做一个简单的一个介绍啊,做一个简单介绍。好这边啊,对这边的问题是什么问什么问题导致的呀。因为这个地方你不能写在外边去了是吧?啊直接我们写到这里面去好,那么我这边应该多打了一个,我先做一个解释,我要做一个解释啊,注意听说明第一点,Test就是一个高阶函数,就是一个高阶高阶函数。
04:15
为什么它是一个高级函数呢?因为它可以接受一个这样的东西,那这个是个什么呢?同学们,这个表示表示一个函数的一个声明啊,或者表示一个函数的一个形式,它表示一个函数,这个函数是什么函数呢?该函数注意听。啊,该函数。该函数函数函数是它的这个可以接收一个double,然后返回的也是一个double。该函数接收。可以接收,接收一个double类型的值,返回呢也是double,所以说你在这儿一看就明白了哦,这个人家可以接收的函数,必须要满足这个形式,什么形式呢?接收一个double,返回一个double的这种函数,我就可以接收。
05:07
好,那么这边同学们看到的这个N1DOUBLE呢,就是我们这个普通的参数,它是一个普通参数,这个跟前面讲的是普通参数。好,再看第四点,我我们看到我在这写了一个这个东西,这个FN1呢,其实就代表我在这个T的函数里面去执行你传入的这个。这个函数啊,就是代表在哪里呢?在T的函数中,函数中执行,执行什么玩意儿呢?就是你传入的,传入的这个函数,你个传入函数是什么我不知道。反正只要满足这种签名就可以啊,你可以理解成这样一个东西,就说如果画一个底层的话,就类似于这个F,它指向了这个函数的一个地址,那么它到时间就把它当成一个函函数参数进行一个使用。
06:03
好,这个就写完了,那现在呢,我们这写了一个最普通的函数,这个函数呢,我写了一个上啊,我让我让他成了一个二倍啊,或者我这样写三二。上二呢,就代表呃,你给我传一个double波过后呢,我把它加加,再返回这个函数,你看就满足你这个函数的一个签名的需要,也就是说你传这个函数呢,不能乱传,你不能说诶我想给你传个函数就行不行,你必须按照这种格式,好,这是一个普通的普通的函数,这个函数大家应该一眼就看出来了,它的它就是可以接受一个double,并返回double写完了,好,现在我们来用一下。看看怎么使用这个高阶啊,只有把这个明明白了,你后面这个才理解的比较到位啊,使用使用这个高阶函数。同学们,我给大家简单的用一下very easy啊,比如说现在呢,我要写这么一个东西,同学们请看test。
07:02
你看这个地方一下就看出来了,我要我要干什么呢?我传入一个,哎,传入一个上二。注意,既然你传的是一个函数,所以说你无需在后面写小括号,如果你写上小括号,或者里面带参数,就代表执行了,好,所以说这个呢,你要把这个去掉,然后再随便传一个值,传一个double就行了,比如说我传的是3.5。就写完了,你看这个就是我一个T的高级函数,接收了一个SUM2这个函数,然后再传递一个普通函数,那么这个它整个会返回一个什么值呢?就是你这返回什么值,我就返回什么值,你看这用了一个类型推导。好,那么这个时候呢,我可以把这个值给同学们接收一下。好,我故意分成两步走,好,同学们注意看一下啊,我现在把res打出来,加上这个res走。运行。那么运行完了过后呢,我们可以看到它返回的应该就是7.0。
08:00
返回就正确。而且同学们可以看到啊,这个地方一定被调用了,这个地方一定被它调用了一次,好,我这写个SUM2被调用。被调用,哪里被调用呢?因为你在这个地方调用了什么。这个看起来有点怪哈,就是在另外一个函数里面调用另外一个函数,而用的是一个。这个这个这个参数传进去的好,你看我再执行一下,你会发现那个上被调用,一定会会被输出来。会被输出来,那有些同学说老师这个东西怎么理解更合理一点呢?我画一个示意图,帮助大家理解这个传函,传这个函数,这种参数的一个机制啊,我我给他简单做一个,做一个这个这个示意图的一个描述底层,那么同学们呢,看看能不能理解好,我把这个这个我就讲一次,后边我就不讲了啊。好,我们打开这个上,我们画一个简单的示意图,来说明一下它底层是怎么玩的。
09:03
好,你可以这样理解。你可以这样理解说,当我们整个代码从这里开始执行的时候,你的这些东西呢,已然被我们加载到方法去了,我就直接画最核心的部分啊,我就直接画最核心的部分,比如说这是我们的一块内存。这是我们的一块内存,那么这个内存里面呢,还是老规矩,因为它是基于JVM的,因此呢,它仍然有三个核心的区块,一个呢我们称之为战区。一个呢,称之为堆区。啊,一个称之为堆区,还有一个呢,称之为我们的方法区啊好,那么在你整个这个加载的过程中,注意听,当你整个加载的时候呢,有一个函数,就是这两个函数呢,被加载上了。这个函数啊,被加载上了,好我就直接给大家画一个示意图,好我就这样子啊,简单写一下就行了,就说这里面有一个test。
10:04
啊,就是这样写。就这个函数被加载进去了。好,写到这儿。啊,我就没有写那么全了啊好,这是被加载了一个,紧接着呢,还有这个呢,也被加载进去了,当然这两个函数是归属于呃,一个一个类的,我就简单写到这。好,写到这以后呢,同学们注意,我们的代码就从这里开始执行了,当我们执行了这样一段代码以后,就是T的二过后,它T的函数过后呢,这段代码是在我们站里面执行的。站里面执行的,那么它会发生一件什么事情呢?同学们看到当你去执行一个SUM2的时候,好,这时你把这个SUM2的一个地址传给了谁呢?传给了这个F,因为你的代码里边有东西的,呃,一旦到这来了啊,一旦到这儿来了,调用这个地地方的时候呢,这个T的函数,我们就进到这个这个T的函数里面去了。
11:05
相当于说我们进到这个代码代码里面去了啊,相当于说我们一直这个地方呢,上面有一个站。在这儿。啊有这好在这过后呢,这个你把这个F,你你你其实是把sum二传给了F的,大家看你这上传给这个F,你就可以理解成这个F它指向了。它指向了我们这个。这个位置。啊,也就是说你可以理解sum,呃,这个上传过来一个这个东西,相当于我们这个F这个变量呢,这个这个参数就指向了SUM2这段代码代码块代码块,然后呢,FN1的时候就会去调用这里面的内容,并且把值返回来。啊,你可以简单这么去理解,也就说你可以理解成F是一个指向上二的一个什么呢?地值,就是函数本身也是会有地值的,就好像你们说,诶,一个变量有地址,一个对象有地址没问题,但是在底层我们的函数也有地址,同学们如果有同学学过这个C或者C加加就知道我们函数呢,也是有可以有一个地址的,所以说这个呢,你可以列解成我们这个F就指向的是SUM2的一个地址,当你调用的时候,它就去找到这个代码块进行执行该反应结果该返回就返回,好这样就理解起来了,千万不要认为是复制了一份这个函数,那就错了,函数是共用的,好理解到这个位置就可以了,好理解完这个东西过后呢,同学们,现在第一个小案例,第一个这个还order,大家应该多少了解了一些。
12:45
同学们看到我们这样传递。也没有问题,有些时候你可以看到有些程序员他是这样传的,那么我再来执行一下,注意听我执行一把,我执行完了过后,你会看到这个代码仍然也没有错,这是这种写法,是什么写法呢?注意听啊,同学们看我再写一段代码,帮助大家理解,嗯,这个下划线的特点是代表我要把一个函数传递给别人,比如说同学们看我这里有个小案例。
13:16
我这里有想叫DF,叫my print,看看东西看清楚了啊,这里面呢,我写了一个非常之简单的一句话,叫做hello,看清楚,Hello word写完了,写完了,那么既然你一个函数。我们在SC里面可以把一个函数传给另外一个这个这个形式,那么我能不能把一个函数直接传给一个变量呢?也是可以的。其实这个本质就是把一看传给变量,那么我们可以看到这种写法。在SC中。诶注意听在开na中开中。是开了中可以可以把一个函数直接直接付给付给一个变量。
14:07
一个变量,这是允许的并入,同学,看我这样写V。V fe等于MY。好,同学们,我把这个去掉,哎,同学们可以看到,如果我这样给的话,我这样给的话,我们现在执行一下这个效果。执行。那么执行过后呢,我们可以看到这里它打出了hello word,其实我并不想干这件事情,我仅仅是想,因为你这样写的话,就相当于执行这个函数,把这个结果返回给F1是这意思吧,但是呢,我们在很多情况下,我们我们想把一个函数直接付付给。啊,这写错了,付给付给一个变量,但是我并不想执行这个变量。但是我并不想执行变量,怎么办呢?同学们,下划线就生效了,同学们可以看到下划线,哎,这个时候当我加一个下划音过,含义就变了,就是把一个函数赋给一个变量,但是不执行这个函数。
15:08
但是不执行该函数,哎,那这个时候同学们看到这个F1呢,这个这个这个类型呢,你看它其实是一个函数。它其实是一个函数,看到没有,你看这个类型是一个没有没有行参的返回是个unit函数,那如果刚才我不加这个呢?同学们再看F1,它其实是一个unit的一个值,大家理解这意思吗?那也就是说,如果我现在再去运行你你们应该马上感觉到不会再输出hello word了,再执行一把。这个点要突破一下。我们这个时候发现他没有搜索hello word,那这个时候你要执行怎么办呢?就跟这个道理是一样的,我在这里F1去执行就no problem,这个就叫就要执行了,这个就是执行,那么我们再玩一把运行好同学们可以看到现在呢,马上就输出了,诶这个没有输出来是因为我没有这样子啊,因为我没有。
16:12
加这个小括号内容呢,它就没出来,加上小括号就没有任何问题,同学们可以看到hello word出来了。那这个逻辑呢,要知道就是说像这个下划线,如果同学们以后看到下划线就表示这个意思,好了,这个我们就说完了,为了进一步理解呢,我们再举一个高级函数,快速的再写一个,啊,同学们再写一个,传入一个无参的这种高级函数,再举一个,好,同学们时间的关系,我把这个小案例拿过来给大家整理一下来,我们再写一个高阶函数的使用,这样子大家理解的就比刚才更深刻了,嗨。J high order order fun demo02不着急啊,我们马上这块就OK了,那么写上一个主函数,我再写一个,哎,嗯,别写到外边来。
17:01
小字,好,同学们,我格式化一下,那同学们看到啊,如果将来我们想去让一个高阶函数接受一个无参的这种,无参的这种,呃,函数呢,你的写法要这样写。千万不要说诶韩老师没有无无餐的,我这省略掉吗?这个就不行,你写个小括号啊,写个小括号就可以啊,这样子就代表什么呢?做一个说明,简单说明一下啊,说明T的二是一个高阶,高阶函数可以接收一个什么样的函数呢?可以接收一个,呃,没有没有输,没有这个没有这个行参列表或者没有没有输入。返回为这个空的返回为unit的函数,Unit的函数。好,这个类型就匹配了,注意啊,这个一定要匹配,你不能乱填,比如说你你说给他传一个,人家要一个无参的,你偏偏要传一个这个函数,它是要报错的啊,我再举个例子,比如说我这有一个叫做呃,叫做这个求这个和吧,比如说我们叫做求它的一个sub。
18:12
你看N一程。好,假如我是这样一个函数,你就不能传给他,我做一个适应好T2,直接把COK传进去,把这个去掉。因为你如果带带小括号,这个含义就发生变化了,如果你带小括号,代表我去执行这个CCOK,把这个结果传给这个F,这个E就变化了啊,你要把它去掉。好,你看这个就可以了,但是你这样传他就会报错,你说诶老师我传一个sub,那我们看看这个时候会怎么样。好,可以看到直接报错,报错的原因非常简单,我们把光标移到这里,看一家说的非常的清楚,他说type Miss map,那同学们想到,既然这个编辑说type Miss match,那就意味着把函数也当作了一种类型。
19:00
啊,这边人家说的很清楚,说我期望的是。我我希望的是这样一个函数,但是你给的是传入一个int,返回一个unit,函数匹配不了,好这点大家请注意一下,好,同学们,我们再执行一下,这个时候就会输出COKOK,好,这两个案例说完了过后呢,同学们理解了啊,好,我把这个反思一下,然后我们就来看看映射怎么解决的。啊,虽然我花了一点时间,但是呢,同学们理解的更清晰了,好,我把这个刚才的一个基本的一个高阶函数的一个补充给各位同学做了一点啊描述啊,就是我举了两个案例啊,帮助同学们先暂时的理解了一下高阶函数的基本使用啊,基本使用案例一。案例一好各位,我把它写到这里来,你案例一,那么这里面呢,我们直接上代码啊,这个代码里面我已经把这些该说的东西都说到代码里面去了。
20:02
啊啊,使用利益,我把这个代码直接给同学们板书过来,第一个案例是在这个位置,哎,这个位置,那么这里面具体的说明呢,同学们把这个代码拿出来一看就了然。好,我把它呢,给各位同学直接插入到我们的这个笔记中,这是第一个案例啊,这个演示的是什么呢?有这个行参传入有返回值的,那第二个案例呢,诶,我们又讲了一个高阶函数测试案例啊是呃,应用案例案例二这个案例呢,我们又举了一个,这个案例的目的呢,是给大家再做了一个,呃,又一个案例就是接收这个无参的啊这个是怎么使用的?好,同学们把这段代码呢,也给同学们转过来,好,我把这个呢给同学们说一下,好的,插入到这里来。好,各位同学,当我们现在有了这样一个基础之后呢,诶,同学们,我们再来玩这个东西就very easy了,好,Very好,现在我们来看这个怎么写好,打开我们的map op第二个案例,现在有这样一个基础,同学们马上就知道了啊,Map。
21:15
啊,Map的oper的DEMO02。好把它放过来。现在同学们,我们。还是完成第一个这个案例,然后呢,我们要用。Can提供的方式来搞定它。来,写到这里来,写到这里来。好,现在呢,我要开始写了啊,这个地方就变得easy了,首先我们先定义啊,直接写代码,We are list等于list,你这给的是357,没问题,拿过来用下面直接一句话搞定,点map,看这里,看这里。同学们看,这个map呢,它其实会接收两个两个值,这个B和that都是泛型。
22:08
都是泛型,那泛型呢,大家就说你给我传什么,我就接受什么,而且它可以接受的这个函数,大家现在能看懂什么意思吗?它可以接受一个传入一个int,返回一个你的这个类,这个类型如果是你原先是这个int返回的仍然是这样一个类型啊,传入一个int就是可以接受这样一个函数,就这种这种形式的函数。好,这个函数呢,我们要写一个好,我先写一个这样的函数,这个函数我先写好,比如说就是刚才我们的这个函数,比如叫做呃,给它进行一个乘积Mo啊Mo。Alive。好P,然后呢,这个操作我接收一个整数啊,我接收一个整数,按int看清楚了,我接收完了过后呢,我还给你返回一个这样的整数。
23:06
好看清楚,返回一个这这样整数。Inch,好,这里面我怎么来处理呢?你不是要乘以二吗?非常简单,我二乘以N。代码就写完了,然后我这里开始要用了历史的点map,你map你要的这个函数我已经写好了。那么我把这个multi play直接传进去,传进去过后,好这个结果就已经拿到了,它直接返回的是一个集合,那这个集合呢,我接收一下LIST2,等于好同学们现在呢,我们来输出一下这个LIST2。List等于它的这个案例好写到这,那这个时候它返回的这个内容呢,同学们可以看到它返回的就是list这个60和14。好,我们来运行一下,我们来运行一下走。
24:03
我们运行一下好,当我们运行完毕过后呢,我们发现这个结果跟我们想的是一样的。那么这里面我们可以来做一个分析啊,他是怎么做的呢?来,我对这个代码要做一个分析,这段代码同学们马上可能看起来又又有点晕了,为什么你们会晕呢?因为我前面讲的这个案例传的是一个数,现在是一个集合,肯定同学们又看不懂了,所以说呢,我要做几点说明,大家慢慢听一下啊,这个突破了,后面就我就不再讲原理了,这句话的意思是什么?就这个东西是到底干了什么事?他做了什么事情,做了什么,首先第一步听我讲,首先第一步他会将将历史的这个集合。集合的这个元素,元素元素一个一个的遍历出来。就是将这个集合里面的元素依次变利。
25:04
便利便历,我们以前是学过的便历,它会把这个便利便历完了,过后呢,注意听这句话,第二句话它会将什么呢?将各个元素,将各个便离出来的元素。元素传递给啊,依次啊,就将各个各个元素传递给。传递给哪一个呢?传递给这个multi。函数。传递给这个函数,那么这个函数呢?呃,就会得到这个你,你来一个元素,我就会得到一个值,来一个元素就会得,于是它就会返回一个新的这个int值。好,第三步,第三步,将得到的这个新的值再重新包装在一个新的集合并返回,将将得到的,将得到的得到的这个呃,新的新的这个int干什么呢?包装在或者是呃或者是放入到,放入到一个新的集合并返回并返回。
26:09
并返回。哎,那讲啊返回啊返回。并返回,那么这样子呢,我们可以理解,理解出来就是什么呢?你这地方一定一共调用了这个multi反一共有几次呢,三次。就是你这个地方,因为你有三个元素,每个元素都会传,传输一次,因此呢,它一定会调用三次,因此因此在这个multi multi play这个方法会这个函数会被调用,调用三次,好,我们来证明一下这个观点啊,来同学们,我们来给大家玩一把,那同学们看到我说它的调用的次数被调用了。好,我们把这个再给它写一遍啊,包来被调用。被调用,OK,好,同学们,我们看看一共输出几次,它一共会输出几次呢?一共会输出三次。
27:08
一共会输出三次。大家看到数参数,那如果说我这个元素,假如说又多了一个。这个九,那同学们这个段它会被被调用四次。被调用四次,果然是四次,好了,那到此呢,这个我们就发现这种特点就出来了,那讲到这儿呢,我最后再做一点说明啊,讲完这个地方呢,我还想做最后一个说明,怎么呢,我想让大家较为深刻的理解这个map映射操作机制呢,我要写一段它底层的代码。这个代码呢,呃。我们来编写一个这种形式,就说我们抛开他的机制,我们自己写一份,看看他到底怎么实现这个东西的,其实就是把我说的这一段代码。翻译成。
28:01
翻译成什么,翻译成一个更直接的一个底层实现机制的代码,把这个讲完,同学们就理解的,后面再讲什么过滤呀,什么扁平化呀,什么这个折叠啊,就一下就一马平川了,就彻底的明白了。好,因为这样子讲了过后你还是不知道,诶说老师你这说了,虽然说了这些东西,那你告诉我到底这个麦干了什么事,我还是没看懂啊。所以刚才为什么先讲高阶,再讲实用,再讲底层,好,这个讲完我就不再多说一个其他那个底层的东西了,来马上再加强一下,现在呢,我们在做最后一个工作,这个讲完这个原理性的东西就彻底的。就O了啊,就是说相对来说理解的更到位了,现在我要深刻理解map操作记,我们模拟实现,现在呢,你这叫list,我写一个类,我叫my list,注意听。好,我现在写个代码啊。模拟。
29:00
就是模拟这个map实现的映射机制啊,理解底层,那现在呢,开始我们写一个类class,注意听啊,My list。My list不说了,My list里面呢,我先搞一个这个LIST1。啊,我就直接一点把这个拿过来用好吧,这个大家应该能看懂,能看懂,当然这个地方其实按理说应该使用一个构造器来构造,但是我没有时间,我就直接把这个已有的三武器写实到这里面,但将来这个实际上是可以动态给它传输进去的啊好,第二个我搞一个新的集合。新的一个集合。注意看大家能不能看懂新的集合呢?那就简单一点,直接是VR啊,叫LIST2。啊,先搞这个集合,我先整一个是空的。空的集合写完了,然后呢,我就要开始写这个map函数了,写这个map函数怎么写呢?非常的简单,Def map看清楚了啊,刚才老师已经讲过了,这个map最后返回的这个结果是一个集合,是不是就最后你经过最后整个处理,它是一个集合,而且这个地方接收的是个什么玩意儿,是不是是一个函数?
30:20
而且这个函数呢,是是不是根据刚才这个这个体现,它是有这个可以使用泛型的,我这里就先不使用泛型,直接写死啊,因为我知道目前我都是整数,所以说我就直接这样写,大家看能不能看懂。刚才我们已经有这个知识点了。这个能看懂什么意思吗?就是接收一个函数,可以接一个这个函数,接收一个整数,再返回一个整数,好,然后同学们看,为了能够看到这个效果啊,我直接给他一个泛型化,因为你不你不做泛型,注意听啊,你这个地方如如果这样写代码是过不去的。你写这个历史的,往这一写,因为你没返回值,所以说有些东学老师,我这写个历史的,这样你过不去。
31:03
不对,因为这里面有泛型在里边,因此呢,我们这样写的话,就把泛型加进去才行。好,这是个int,我这样写就没问题了,好代码就过了,当然这个在这样返回是个空的,没有用,而且没有体现出调用这个,在这个map里面调用这个函数的感觉,那应该怎么写呢?根据刚才老师所说的,他先遍历。他依次对这个历史的几何进行便利,那我就便利。看清楚啊,电力这个集合。便利这个这个这个集合,这个集合注意听啊,这个集合是谁带过来呢?就是将来你这个历史带过来的。这里面肯定是藏的,有这个数据结构的嘛,就好像我这MYMY里面藏了一个历史的一样,但是底层里历史的还有还在藏,藏的可能是个数组什么的,我们就不往里面再追了,我就追到这一集就行了,那我就遍利它for循环,注意看啊,Item。Item item,然后走便利我的当前这个对象里面的历史的一。
32:05
好,各位同学,我遍历完了以后,是不是这个item就是我们这个集合里面的各个元素。那么我要做什么事情呢?我要对这个元素,把这个元素传给这个multiply,但是这个multiply呢是现在是个F,所以说我要干件什么事情呢?我要干这样一件事情,我要干F传入这个。大家看是不是在这底层,在map底层我会调用多次好调用完了这个结果是不是我要交给他呀,我交给他没问题,这个调用它,因为你这传进去就已经成了二了嘛,那现在我要怎么?诶还记不记得怎么传给一个这个不可变的这个集合,当然你要写好,还可以写成那个list的buffer啊,我没有写这个可变可变的,如果可变应该更简单,那这个是怎么给他呢?是不是这样写的。是不就这这这这个不行是吧,怎么整的呀,啊是这样子的啊,等于我这样写吧,同学们。
33:05
好,是不是这边冒号加就可以了,能能理解什么意思吧,就是我我把这个东西加给他再返回他好返回了过后经过一系列处理,最后把这个list返回。啊,那这样子就说相当于我在底层做了些什么事情呢?在底层map里面,我反复的去便利激活过,反复调用你传输的一个函数。好就写完了,那写完以后我们来玩一玩,玩一玩,看看到底OK还是不OK,那首先我们先整一个自己的M。六一个啊,六一个时候人家是这样六的,我们也可以这样六,我再写一个它的什么呀,半身对象能理解这个半身对象里面呢,我重写一下apply。Apply方法。好,他一下就给我们生成了,他一下就给我们生成了,在这里我们是不是又拿到一个my be的,那我就简单了啊,我直接。用这个啊,当然这个地方最好是来一个小括号啊,我写个小括号,小括号这样我怎么用呢,非常简单,就这样写就OK了。
34:09
这样子我们就拿到了一个曼的,那么我们先输出一下这个东西是不是一个曼斯看。啊,我们先输出一下,看是不是它运行。好运行,那运行完了过后呢,我们可以看到啊,这边的确拿到了一个MY的好,那就没问题,没问题过后呢,我们现在就可以用我们写的这个机制来完成的,请看代码my is.map。好,这个地方,呃,My list点点map点不出来的原因是什么?知道吗?是不是因为我在这这我因为我我自己加了一个小括号是吧,所以说我这里是不是如果我不加,是不是相当于把这个object这个对象实例给人家了是吧,把这个给他了,我我不是要这个,这个我是要调他的apply是不是应该加一个这个呀。是不是这样子才是对的啊,然后我们调my play,再点map就出来了,然后它传入的是一个函数,这个函数我们仍然使用这写好的multiply。
35:06
传进去,传进去就OK了,最后我们得到一个新的集合,比如叫my list2等。好,同学们,此时此刻,我们代码几乎就跟他写的完全一样了,只是我,我在这个my list里面藏了一个list而已。那这个时候我们来调用一下看效果。好,MY。LIST2等于加加my list2点,我把这个点出来啊,我要把这个点出来,点出我们的list。List诶这个地方我看看为什么没有,呃,哦,这返回的直接就是一个list了,那就直接输出就可以了啊,因为它返回的就是它我直接输出,好同学们看一下这是我们写的这段代码,能不能正确的运行呢?来跑一个代码。好,当我运行过后可以看到这个效果,诶同学们可以看到我们跟它返回的结果完全一样。
36:03
啊,到此到此为止呢,我们就把它的一个底层的一个是模拟的一个机制就写出来了,当然这段代码呢,跟他原真正的底层肯定还是有些区别的,比如说他可能做了一些优化呀,做了一些算法的处理呀,我这里就很直接的把这个拿出来便利处理,将来这个地方就会有很多工作了,这种机制有了过后呢。这个就是开了这种机制,它可以做很多工作,比如说过滤,一旦要过滤,其实它这地方就是便利过后里面再进行这个过滤,这个就。就进行各种操作了,过滤或者扁平化都在这里可以加东西,比如说过滤啊,比如说扁平化。都可以啊,扁平画等等等等等,全部都可以在这里面进行各种工作,而且这边呢,调的函数就可以是根据你的需要不停的调函数了,好,这就是它的一种机制啊,就是它的一个底层机制,好同学们到此呢,这个机制我们就分析完了,现在我们有必要把刚才讲的东西做一个简单的板书,好那么刚才我们讲的是什么内容呢?诶,这一节讲的东西比较的多啊,比较多,我们来板述一下。
37:18
刚才我们讲了一个高阶函数的使用,诶高阶函数之前好像这个没有写过来对吧。呃,这是传统方法高阶函数的基本使用,那么这里呢,我应该再加一点东西。好,这边是呃,高阶函数使用案例,我们把这整理一下。嗯,应该是这个地方没写啊。Map映射操作的一个介绍,先拿过来。诶,写在高级函数之前。在这儿。好,高阶函数之前在这儿。好,我看看是在哪个位置比较合理啊,在这在这使用完了过后,我们这讲了一个这个map映射的一个知识点啊。
38:02
Map因式,好,我先把它写到这啊,这是我们标题三。好标题三,那标题三我做了一个什么说明呢?我首先啊,说出了这个map映射的一个基本介绍。对我说map映射表示什么含义,做了一个介绍,那这个介绍完了过后呢,诶,我就给大家讲了一个啊,高阶函数的使用啊,传统方法和高阶函数的使用。那这个讲完了以后,我们就来说了一下,呃,说了一下什么呢?就是使用map解决的这么一个案例。好,使用map解解决的这么一个案例,那我写在这个高阶函数的屁股后边。啊,使用map来解决的一个案例。好,把它放到这里啊,都很简单,那么怎么解决的呢?是这样写的。是这样写的,找,找到这段代码。找到这段代码是这。
39:01
这段代码呢,是我们使用什么呢?使用这段代码从这开始这一节。是我们用。呃,就是是看map方法来解决的,好这段代码呢,放到这,那我们把它拿过来啊,把它拿过来。好,这是使用map方式来解决的,那这里面还有一个函数,我把它粘过来,就是这写了一个,呃,主主要看这句话就看懂了。哎,把这句话看懂。就怎么写的呢,就是类似的卖读multi版啊multiply这个方法呢,我们写到这的,把这个方法也给大家拿过来,诶这个方法是单独写到这了啊。加拿过来。这样是就有一个对应关系了,大家一看就清楚了,哦,原来是这样子的啊,历史的拿过来map map完了O传了一个这个函数,进行这个映射操作,那么这个讲完了以后呢,我们呃使用了一个方式,就是来给大家做了一段模拟代码。
40:02
就是我们自己写的一段代码,模拟它的map实现的这种机制,好给大家写到这里来,那我把这段模拟代码呢,直接这个是最终代码嘛,所以干脆我把整体拷贝过来,再把那个关键的地方给它标成一个红色。好,这是整体理解,往这儿一放,放完过后呢,我把关键的部分标出来啊,哪里是我们模拟的呢,从这开始。哎,这一部分是我们的模拟的核心。好标准。这个粗体,然后我们用的时候怎么体现出来呢,是这样用的,在这用的。好,同学们,那关于这一块的一个就是麦普映射的模拟和它的一个机制,我们就说到这里。
我来说两句