00:00
好,那开始咱们今天课程我们还是做一个简短的回顾,把上一次课讲的内容呢做一个回顾,看一下上次课我们讲了什么内容啊。好,我们还是打开上一次课的视频就一目了然了,那上一次呢,我们是从麦普映射,哎讲map映射,把map映射讲完了过呢,我们讲了下一个章节就是模式匹配,那么模式匹配呢,咱们没有讲完,讲到了匹配元组这块。呃,这是上次课咱们讲的内容,那么打开我们的笔记,我们来做一个回顾。好,首先呢,我们先定一下位对不对,我们先找到哪里呢?先找到数据结构下。那同学们现在呢,我们来想一想哈,我们来想一想我们11章讲了哪些内容。来首先呢,我在这先给同学们说了一下这个map普映射的这个,这个就是我们叫做这个map映射,这个map呢,它不是指的我们的一个集合的map,它是一个函数的名称叫map啊,它不是说只能针对map这种数据结构进行这个映射啊,好那么他是干什么事情呢。
01:20
他是干什么事情呢?好,我找一个同学来简单的呃,说一说麦普音色,它主要是完成一个什么事情,好,或者说呃,什么时候咱们会用到一个麦普映射。看看你对这个map映射的一个理解,最好呢,能够分析一下它的运行的原则原理或者说机制。好,那我随机的抽查一位同学哈。那么咱们搜查。一位同学叫。叫这个。叫张望同学在吗?张望同学来。哎,回忆一下好不好。啊,Map映射它是干什么的,你谈谈或者说你谈谈对他的一个理解。
02:12
嗯。嗯,那个操作的时候他是,呃,怎么操作的呢?它的机运行的一个机制是什么样子的,你你能谈一下吗?就是。当时我当时我写了一段模拟代码,用开写了一段模拟的代码,还还记不记得大致它的一个运行的原理。当时写了一段代码。有有一点忘了是吧。好吧,请坐下吧,啊,张梦同学,请坐下,我再找一位同学哈,再找一位同学,再找一位同学叫郭静同学在吗?来,小郭同学来回答一下。Map映射它是干什么的?
03:09
啊。对对对对,好可以啊,请注意下啊呃,虽然答的比较简洁呢,但是大致把它的一个一个这个核心的知识点答上来了,那么map映射,听这个名字嘛,Map翻译成我们的中文呢,就是映射的意思。那它做什么意思呢?它就是我们这有我们这个地方有一有一些集合,那么集合的数组的元素呢,每一个都要进行一种处理,对吧,要进行处理,那处理呢,我们以前传统的方法就是用一个函数来接收这个集合,我们以前教学Java的时候,传统方法就是写一个函数,把这个集合拿到,然后呢,干什么呢?然后咱们在这个函数里边对集合进行编辑,再进行操作,是这样子的,但是这个scan的map映射呢,它反其道而行之,它是反过来调的,它用这个集合点map再传入一个处理函数。
04:08
那么这个时候呢,在底层他会怎么做呢?我当时应该是写了一个这样的啊,这样的一个理解吧,当时我说深刻理解map的映射机制,我写了一段模拟代码。我写了一段模拟代码,在哪里写的呢?我记得应该是在my list这边简单的演示了一下,我说假如我们有一个对象里面有一个map,它的本质是干什么呢?就是这个map呢,它会接收一个函数。对,那这个函数的形式呢,其实它是支持泛型的啊,不是说呃,一定是int和int,只是我当时没有把这个泛型加进去而已。对,然后呢,他在底层做一件什么事情呢,他在底层就是将我们这一个list。将我们这个历史的当然也可能是别的,别当然也可能是别的集合了它进行一个便利。
05:04
啊遍历,那遍历的过程中呢,它会把这一个遍历出来的每一个元素进行一个处理,处理的时候呢,就是用的你传入的函数。对,然后呢,处理完了过后,他把这个结果呢,啊,想办法放到一个新的集合里边,最后返回一个新的集合啊,这就是他的一个基本原理。那你理解这个基本原理以后呢,对我们理解过滤扁平化折叠,其实就应该说是还是更好理解了啊,当时我是写了这么一段代码,大家应该有一个印象。好,那么把这个map映射说完了以后呢,我们又给大家讲了一下,那filter特是干什么的呢?找一个同学来说一下,呃,集合的filter它是做一件什么事情。来,我随意的找一位同学啊,叫杨长文同学来回答一下theatre是干什么的?啊,过滤操作,呃,具体的来说,是不是也是传入一个过滤的函数是吧?啊对。
06:06
对对对,那么这个过滤函数它有什么要求没有,就是你传给这个filter传进的函数,这个函数是随便写吗?还是有要求。必须要返回一个布尔类型,对吧?好,请坐下,好对这个菲呢,它是你可以写你的条件,但是呢,它有一个前提,就是说你的这个这个过滤函数,它是要求返回一个布尔类型。那为什么要返回一个布尔类型呢?因为它在底层调你这个,在你进行这个过滤的时候,这个底层这个filter其实你也可以模拟一下,就是它会根据它还是会便历你这个names里面的元素,然后把你遍历出来每一个元素扔给这个start a,然后如果说这个start a返回了一个处呢,我就把电离出来这个元素扔到一个新的集合里面去就行了。对,是这样子的啊,所以说同学们可以想到,想象到将来我们的map和filter是可以结合使用的。
07:04
对,比如说我我们将来有可能是这样写的,就是比如说我们先对对一个集合进行一个映射。接近一个映射,比如这里有个函数,然后呢,我们再进行一个filter操作。啊,有可能filter完了过后,我们再进行一个折叠的操作,对,所以它是呃,它是这么一一种,就是有点类似于函数式练的一种编程方式,这种方式呢,其实它的编程力度更大。而且呢,它这个也比较高效,因为它处理的单位呢,处理的这个我们叫做处理的这个单位已经不再是一个变量,而是针对整个集合了。啊,这种方式呢,其实还是非常多的啊,用的非常多的,好同学们呢,这个慢慢去体会一下。好,然后呢,我们又讲了化简折叠和扫描,那么我找一个同学把化简折叠、扫描简单的说一下它是用来干什么的,就就说一下化解式,呃,他是做什么,然后它的一个运行的机制,折叠和扫描也简单谈一谈。
08:10
好,我随机的抽查一位同学。叫张颖同学来回答一下。嗯。对,那这个扫描呢。嗯。对,就是他会把整个这个过程。进行处理的结果放在一个集合中,对吧。好,我们来简单的再看一下化简。
09:01
化简它是首先也是有前提要求的,首先这个化简呢,它是将二元函数引入到我们的集合中,也就是说你化简传入的这个函数呢,它要求是二元的。啊,你不能是其他的这种函数,那么我们当时这个化简做了一个什么最经典的案例呢?比如说我们要用这个化简的方式来求和,就很经典。化简那里面。大家看到这个reduce reduce里面又分这么呃三种,当时我们说的有三种是吧,Reduce,呃,第二个是reduce left。还有一个是reduce,呃,Right应应该是这样子的,而且呢,每一个呢,我都做了一个案例和介绍,这些呢大家要有认识哈,那当时呢,我们还画了一个图,有一个图展现出来了,这个左左则左化简和这个右化简的区别是什么?对吧,左化解呢,它是从左边。
10:03
开始这个运算,然后把它这个呃得到的结果呢,作为下一次运算的参数传输给他第一呃这个做一个值传输给下一次运算的呃这个第一个参数,那么右化简呢,它是从右边开始运行,它会把这个算的结果呢,作为第下一次调用我们这个化简的里面写的这个这个函数的第二个参数。好,这个呢,大家要有一个基本的认识。哎,那么在化简的基础上呢,我我们又讲了一个折叠,折叠的本质,折叠呢,其实跟化简其实非常的相似,那唯一的一点区别就是折叠呢,它是折叠,它就是需要带一个头的,就是你要去指定。第一个。或者是最后一个元素,那么折叠的时候呢,我们呃,这个这个结果呢,可以一次性的就啊,就是按照我们预算的一个规则,把所有的结果都放在我们的第一个或者是啊最后一个元素中。
11:10
那么这个流程呢,我这也写的比较清晰。还有一个缩写我就不讲了,缩写呢,咱们就是能用的就用,用不了的就算了啊,因为记不住扫描呢,它最大的区别它是也是做这个折叠,但是呢,它会将所有中间的结果置于一个集合中。哎,它会放在一个集合中,这是它的一个特点,同学们呢,要有一个印象好,当我们把化简折叠扫描讲完以后呢,我们讲了一系列的,呃,需要同学们知道的扩展的知识,还有一个综合案例。啊,讲了一个综合案例,那么这边我们还讲了拉链。迭代气流。试图。诶,那么视图呢?假如别人问到你视图它是用来做什么的,哪个同学能简单聊一下这个视图它的作用是什么?
12:02
或者说使用视图和不使用视图的区别在什么地方,我找一个同学说一下啊,叫宏建同学来回答一下。对,实际上它使用一个懒懒加载的,或者或者叫惰性函数的特征特点是吧,诶这点大家注意,就是说将来我们在什么应用场景可能用到这个view呢?比如说我们做一些大数大数据量的计算,但是我们不一定马上去使用这个结果,而是等待用户的一个行为来出发。啊,这个时候呢,我们用V比较合理,比如说我们现在要运算这个1000万个数据,或者是更大的数据,我们给不同的用户,但是这个用户呢,你不确定他现在马上用不用,而用户用的时候呢,他会比如说点一个按钮。或者是呃,做一个什么动作才会去看,那么这个时候呢,我们可以用V的方式来进行这个优化。
13:09
啊,这样呢,我们对于我们这个运算力,就是对我们整个服务器的运算力呢,会有一定的这个保存。啊,运力对我们计算机的一个系统的运力有一个保存和优化。啊,不然的话,你你1000万个数据,你得到结果,但是人家只看到两个三个,你就很不划算了。好,这是这个,还有讲了一个并行,那么并行集合呢,和这个它的这个作用是什么。首先你要知道并行集合它的作用是什么。呃,我们来找一个同学说一说并行集合它跟非并行集合最大的区别,或者说它的作用是什么?好,我找一个同学说一下啊,叫刘闯同学来回答一下。并行集合是用来做什么的?
14:00
或者说不用并行集合,他又是怎样子的,有印象吗?好。闯哥有点忘了是吧?啊,闯哥,请坐一下吧,来找旁边这位同学吧,叫小牛同学,牛丽潮同学,来回答一下。啊,请假了,小牛请假了,小牛生病了哈,呃,再找一位吧,叫宋延国同学来回答一下,小宋也请假了吗?啊,小宋还在啊?来,小宋。嗯。啊,那他具体来说它是怎么实现这个效果的呢。Dear parano。啊,还是非常好,请坐下啊请坐下,他也把这个核心点也答上来了,就是并行集合,主要是为了使用多核提高我们这个并并行运行运算的一个能力,那么它它这里面呢,实现的方式其实挺简单,就说你只需要在你的集合前面先加一个parael,然后再去做你的这个操作就可以了。
15:16
它这个还是很简单的好,那么并行讲完了过后呢,我们还讲了操作符,操作符呢,我们重点讲了这么几种啊,就是中置后置前置,那么这个呢,大家要有一个基本认识,就说如果你们以后看到别人这么去用,比如说对一个对象进行一个加。或者是对一个对象进行加加,或者前面写的一个非这样的一些操作呢,你要敏锐的感觉到它其实已经对他进行了一个重载。好的好,紧接着我们讲了,呃,模式匹配里面的match。那么这个match它是,呃类似于什么呢?类似于Java的Switch,但是它的功能比我们的呃,Java呢要强大很多,那为什么说它比Java的所学要强大很多呢?因为它支持很多形式的匹配方式。
16:09
啊,它支持很多形式的匹配方式,你比如说像呃得到的变量,或者是匹配类型,匹配我们的数组,匹配我们的列表,匹配我们的元素等等,那么用这种方式呢,我们就可以快速的实现一些啊功能。啊,说上次课呢,我们也把这些都给大家说了一下,对吧,说了一下大家应该还有一些印象,应该还有一些印象,那么我这儿问一个同学啊,这个守卫在模式匹配里面的守卫是用来干什么的?它的作用是什么?好,我找一位同学谈谈这个,呃,Match里面用到首位,它的作用是什么?好,我随意的抽查一位同学,叫做,呃,找中间同学吧,叫高明同学来回答一下守卫是干什么的?
17:04
对。好,请坐一下啊,回答的也还是比较清楚的,就是这个所谓的作作用有点类似于,类似于什么呢?就是说有点类似于把我们这个模式匹配的一个具体的一些值。这个扩展成我们可以对一个范围进行匹配啊,那具体来说呢,就看我这写了一个案例对吧,比如说我这儿首先先写一个下划线,下划线表示忽略我们传入的CH,然后呢,后面我们写上我们的条件。那这样子的话呢,它就会如果你这个条件满足了,对,那么我们就可以去执行后面的代码,所以说明其实match呢,它既可以匹配单个的值,也可以匹配一个范围的值,所以说呢,呃,就兼顾就是很轻松的就实现我们以前用Java想去写的那种。
18:02
那种效果你看Java要实现这个的话呢,对不对,同学们你你还得那个要写一个转换的形式,或者调一个函数来实现,那这个呢,它就简单了,直接以语言层面就支持好,后面讲了模式的变量匹,还有类型的匹配,类型匹配是一个重点,同学们后面大家要要用的比较多,然后呢又讲讲了匹配数组。啊,讲了匹配,讲了匹配数组呢,就上次给大家留了一个题啊,留了一个提示在这里。啊,在这个地方我们留了一个体,就这。好,怎么实现这个呢,后面呢,有有同学已经做出来了啊,其实这个地方有两种方式,如果你是返回一个buffer。那你呃,那你这直接打印就能看到这个结果,如果你是呢,你在这点一个to string啊,就写一个to string的方式就可以了,我们把这个代码打出来看一下就行了啊,上一次课我们把这个match arra拿出来给大家,Lawyer在哪里呢?在这里。
19:03
啊,在这里。好,那现在呢,我们来进行这个简单的这么一个处理啊,好,我们怎么写呢,比如说我这里想只想拿到。只向拿到一个二位,而且我想把这个值给它返回来,怎么办呢?简单的很啊。咱们这把瑞。8UFF分R8UFF分,然后呢,把这个进行一个交换啊,进行交换,进行交换过后呢,我们来运行,大家看这里啊,就是只有两个值的,比如说是一零对吧,这个呢,我们要把它呃匹配到,然后返回一个a buffer,我们运行一下,这个时候呢,能够拿到一个什么呢?此时此刻我们应该拿到一个r r buffer,这直接就是r buffer了,然后呢,这边是什么呢?因为我这呃有两个指的就应该只有它应该是零一啊,这样就可以了啊,直接返回一个22BUFFER就能用好,我运行一下。我运行一下。
20:01
好的。好。稍等,第一次运行有点慢哈,那这个时候呢,我们可以看到已经拿到了一零,就这就是我要的不处理的呢,我这做了一个故意输出的一句话啊,故意输出的话,如果你你这边什么都不都不处理的话呢,那也可以返回一个空啊,然后呢,你这如果说说老师,那我就是要返回一个二,你也可以用A,呃,然后呢,To Buffer一下啊就可以好,这是上次课的一个简单的一个说明,那下面呢,我们又讲了匹配列表和元组,这个就不再一个个的讲了。好,上次回顾我们就先聊到这。
我来说两句