00:00
那同学们来看一下咱们今天的内容哈,首先第一个呢,我先把这个作业答案先给大家放下来,一个呢,是作业八的答案的这个公布,大家呢,按照这个作业去看一看啊,嗯,应该说同学们拿到这个答案再去看,从目前大家的水平来来说呢,应该是没有任何问题的,那如果说确实还有看不懂的地方哈,还有看不懂懂的地方呢,那你就这个。呃,再问一下同学或者老师,实在不行呢,我到时候再找一个时间评讲一下啊,这是第八题的,这是作业九的答案,也给大家放下来,对模式匹配。还有就是高阶函数,这些答案呢,都是跑的起来的,就是没有问题的,同学们如果说看不懂,你也很简单,就把这个代码放到你的工程里边去建一个测试文件,你运行一下,尝试着看一看都是。特别简单的哈,但是呢,大家还是要去练习,大家还是要去练习,这些呢,都大家说了好,那么这是关于作业的事儿,紧接着呢,我们把上次课的内容做一个简短的回顾,对,画个要画个这个啊小十分钟,我们来回顾一下我们上次课讲的什么内容,那首先呢,我们还是打开第九天的视频,我们看看讲的内容是从哪里到哪里,那上一次课呢,我们讲的内容,内容是从对象的匹配。
01:29
对对象的匹配到哪里呢?到递归,就是让大家用递归的这种这种思想去思考和编程,好的,那现在呢,我们还是把这个笔记打开,打开第十天的笔记,那么我们往下搂一下啊搂一下。好,现在我们就可以把整个目录再更新一下了。把整个目录更新完了过后呢,你这里会得到一个完整的目录,对,这边会得到一个完整的目录,就下面也是。就看得很清楚了,那我们上次课既然是从对象匹配开始的,我们就这样看,给他打开第二集,不用看那么多,对,我们是从哪里呢?应该是从模式匹配的对象匹配开始讲的,对讲,那这讲了,然后讲了13章的函数式编程的高级和用低贵的思想去思考问题。好,我们来看一下对象匹配。
02:26
呃,那么对象匹配呢?首先哈,我开篇名义,我先给大家说一下什么才算是对象匹配,先把这个概念抛出来了。啊对,因为类型匹配我们很好理解,对吧?只匹配很好理解,但是对象匹配指的是什么意思呢?它是指并不是说你这个对象跟他对象相等,它是指的什么呢?就是case中的对象的按play方法提取器,如果返回的一个sum集合,则匹配成功,如果返回一个嫩,它就表示匹配失败。因此呢,我们就做了一些案例,比如说对吧,我举了一个SC。
03:03
对,我构建了一个SC,当然这个地方你是不是构建出来的,还是直接赋值都可以,那么当你去执行到case这么一个。就说这么一个,呃,这个这个形式的时候,这一看就是他用的play方法来进行匹配的嘛,然后匹配匹配的时候他会做件什么事情呢,我就说的很清晰了。对。今天就是包括后面我们写阿卡的时候呢,这里面就会这种方式就会大量的使用到。那如果说你在匹配的时候,它会去调它的apply方法,On apply方法,如果说这个on apply方法返回的是一个sum集合,那么就算是匹配成功了,匹配成功那么它会把你这个值给你放到。这个N里面去。啊,然后呢,这个N你就可以用了。好,那么对象匹配完了过后呢,我又讲了第二个应用案例,第二个应用案例跟第一个应用案例最大的区别就是如果我们匹配的时候有多个参数。
04:08
对,有多个参数,那么我们这个地方它会默认调用on applied sequence这个方法,其他的机制是一样的,还有一个呢,就是它返回的这个sum呢,就不能说是只有呃一个值了,而是多个值。他会依次把你的返回的爱丽丝,比如说你这是返回给爱丽丝,我就交给first,如果是bobo就交给second,如果是汤马斯就交给sir,如果你这个不一样,那他认为是匹配失败的啊好,这个讲完了过后呢,我们又讲了变量声明中的模式,这是什么意思呢?这种方式特别好用,它可以让我们用一行就是一一条语句,可以达到给多个变量赋值的效果,这个呢还是比较好用的,同学们以后呢,比如说你们变量定的比较多是吧,我懒得写那么多,怎么办呢?咱们就用这种。
05:07
呃,变量声明中的模式来进行匹配,这样也比较简单啊,这个呢,这这种用法大家要注意一下,紧接着我们讲了for循环表达式对吧?那for循环表达式呢,这里面其实就是体现出在for循环的时候,我们可以根据自己的需求来取出对应的这种集合里面的值,比如说麦。那map我想让K8都拿到,诶我就这样匹配。那如果说我只关心这个map里面的满足某个条件的这种元素,那我怎么办呢?诶,我就可以指定一个固定的值进行一个过滤。诶,不要小看这个啊,将来还是非常有用的。那再比如说这个,我还想对这种这个条件多加一些判断呢,我可以加首位啊,我可以加首位,这样效果就更好了。
06:01
好,这个讲完了,我们又讲了一个样例类,样例类同学们是我们的一个重点,样例类是一个重点,为什么这么说呢?因为样例类呢,它后面呢,还可以结合我们的这种偏函数来使用,对吧?那样样例类重点怎么理解呢?样例嘛,诶就好像模板一样,所以说我当时说样例类你就可以简单成理解成好像一个模板一样,诶为什么呢?因为你声你只要声明一下这个类为样的类,那么它就会默认生成一系列的方法。我们,呃,今天讲阿卡的时候,今天我们就会讲阿卡,那么今天我们讲阿卡的时候呢,你就会看到老师就会去使用到这个样粒类了,啊特别的好用,因为为什么呢?样粒类其实除了它本身是实现很多方法之外呢,还有个特别厉害的地方,它还实现了那个串行化的接口。
07:00
那实现创新化接口有什么好处吗?以前老师讲过,在学Java的时候,老师说实现创新化有什么作用啊?我问大家一个问题,就实现创新化大家都知道,那实现创新化的作用是什么呢?好,我找一位同学说一下啊,就是假设面试官问到你第一个串行化是什么,第二个串行化的作用是什么,简单的说一下你的这个认识,好,我随机的抽查一位朋友,好,这个叫做刘波同学,来回答一下,来小刘。先说创新化是什么?是able,它你是只是一个名词吗?串新化它有什么,它可以干什么呢?嗯,那创新化了过后,这个对象会怎么样呢?二进制的嘛。嗯,传输的,传输的时候就是网就可以传输了,不串行化不能传输是吗。
08:05
啊好,大体也是大上去做一下啊,大体还是回答的就是大体它的意思是知道的,准确的讲呢,串行化,就是说它可以把你的一个类型。把你的一个类型,比如说对象对吧,经过我们的创新化,经过我们的串行化,比如说我们串行了。创新化吗?这个创新化是S。是要写的吧?啊,就就序列化啊,序列化就序列化啊,就是序列化啊序列。序列化。序列化,它序列化过后,它可以干什么呢?就是把你这个对象一个字符串形式对不对,它就做成一个字符串,字符串。
09:01
字符串这个形式了,那么你一旦做成这个字符串形式呢,你有几个用处呢?第一个用处,第一个用处就是你可以保存,保存到文件中。也就是说你可以直接将一个对象保存到文件中,那么有些语言里面直接叫freezing,叫冷冻或叫冰冻,对吧?Freezing,这个这样写的freezing。就是free。Z啊,就是冰冻,那么你冰冻有什么好处呢?就是我可以倒时间再使用这个反反序列化,是不是我可以用这个反序列化把它再恢复回来,对吧?诶就是它还可以用反序列化。序列化进行这个把它再保存起来,这是第一点,第二点呢,因为你这个对象变成字符串了,你就可以,还有什么用处呢,你就可以做一个什么呢?就是网络上的传输。
10:00
进行网络传输。哎,这个呢,就是它的一个重要的作用,如果你不串行化,你这个对象就没有办法在网络上传递,但是大家都知道,将来你们这个学Spark的时候,我们这个任务他这个主从在进行,这个就是master和worker,他在进行交互的时候呢,它是需要信息传递的,所以说如果你不串行化呢,就会。没有,没有办法达到效果,而我们这个样例类呢,它就默认的怎么样实现了创新化。啊,实现了我们这个序列化啊,这样子呢,就比较方便了,比较方便,所以大家知道这个细节,那央利类说完了以后,我们又讲了它的几个最佳实践,尤其是咱们的第二一,呃啊不不,第一个啊,第一个我们讲了创新化的一个作用,第二个呢,我们还讲了新化可以拷贝等等等,对不对,然后我们讲了这个制,呃中置表达式,还讲了一个什么呢,匹配嵌套模型。
11:06
这个匹配嵌套结构呢,我当时做了一个案例,这个案例呢,准确的讲还是有一点点小难度的,就虽然不是很难对吧,虽然不是很难,但是呢还是有难度的,那希望同学们呢,把这个案例至少能够把它理解了。把它理解的基础上呢,自己能够自己把它写出来啊,代码其实并不多,代码就是完成这段代码,就这么一个函数方法就搞定了,就是price怎么怎么去用的,但是大家要理解它是。如何实现的好,同学们,我在讲课的时候呢,我也做了一个分析,同学们好好去理解一下,紧接着我们讲了一个密封类啊,密封类呢,就是一个概念的东西,就这的,那么我们这个类呢,只能在本文件使用了,紧接着我们讲了函数是呃,高级编程的一部分内容,首先是偏函数,那我找一个同学来简单的说一下偏函数,呃,你是怎么。
12:09
理解的对,你是怎么理解的,先说它是怎么声明或者说怎么定义的,然后再说,嗯,它的这个作用是什么?好吧,随机的抽查一位朋友叫做这个partial function,你是如何理解的?那我找一位同学,找一位同学啊,啊,找一位同学叫。这个。随便找一位同学叫做哦。呃,高明同学在吗?高明同学回答一下。不在了是吧,好,我们祝他这个。身体健康啊,身体健康,早日恢复好,我们再找一位同学,叫张强同学在吗?来,小张,你说一下偏函数你是怎么理解的?
13:03
好的,它那个偏函数是怎么生命什么定义定义出来,或者生命一个偏函数,呃,那个形式还记得吗。啊。实现它的一些一个方法对吧?嗯。啊,还有一个简化的形式,直接用这个case也能搞定是吧,很很好啊,很好啊,小张同学呢,回答还是请坐下,小张同学回答还是比较到位的,比较到位的,那首先我是怎么讲这个偏函数,我先提出一个需求,引起大家思考,然后呢,我就快速的说,我用传统的方法可以解决,用模式匹配呢也可以解决,那是不完美,所以说其实我这个解决方案其实就本身就体现出了偏函数的本质,因为偏函数的本质其实就是先过滤再映射,是不是这意思啊,大家应该还有印象,所以说偏函数的底层就是我写的,但是呢,人家已经提供偏函数了,你就不要自己再去那么搞一遍,你看当时我们用这个方法,我们搞了几次,先filter。
14:09
再卖谱,把它转成了一个亿的再卖,你看多麻烦。你这个逻辑就有过滤又有映射的,这个逻辑呢,其实就是偏函数的本质,那么偏函数我们怎么做的呢?好,我们来看一下那偏函数,我首先来了一个快速入门,就是用偏函数解决前面的对list的一个过滤并。加一的操作,那准确的讲呢,偏函数就是一个part function的一个匿名的子类啊,一个子类,那么这个子类是怎么做呢?我们写了个DeFine at,诶这个方法就是用来判断你这个满不满足的条,满足一个挑解条件,如果说你满足这个条件为真,那么我就去执行apply方法,如果你不满足条件,我就不执行好,那么这样子讲完了过后呢,我们就总结了一下偏函数,对吧,我说A是怎么怎么怎么怎么回事。
15:04
啊,怎么怎么回事,讲完了以后呢,我们说偏函数这样写太麻烦了,就这样写,虽然是OK的,你看这样写,先定一个is DeFine at,再写一个apply算也可以,但是太麻烦了,没有必要搞这么麻烦,因此呢,他就提出了简写的形式,那简写形式呢,第一种咱们呃,简写形式是。呃,有这么第一种形式是吧,Case语句啊,这样case语句把这个呃。直接这样写,直接这样写,不用再分别的写那个练习方法了,这是第一种,第二种呢,还有一个更简单的方式,就是直接用C把语写到这里面去,这样子也是很好的,好,今天我们我们学的一个阿卡呢,也会用到偏函数的这种用法,阿卡里面有个特别重要的方法叫receive方法里边它就是用到了这种模式实现偏函数的。操作。
16:01
好,这是我们的偏函数。紧接着我又讲了作为参数的函数,这个就不说了,换言之,就是说我们可以将函数作为一个参数传递给另外一个函数。就是这样一个意思,那这样用法呢,也是非常多的,非常多的,那这里面我也讲了很多细节,基本介绍应用实例,代码总结好了,我又讲了匿名函数,那匿名函数是干什么呢?就是匿名函数,我这写了一些案例,比如说我们直接去。声明或者说定义一个匿名函数交给一个变量,然后呢,我们通知通过这个指向匿名函数的变量来对匿名函数进行操作。但是要注意匿名函数一个最重要的地方就是首先没有名字,第二个呢,它这个原先这个等等号变成了这种符号,而且呢,也不用写返回值,返回值呢,它用类型推导来做的,你写上返回值呢,反而反而会报错。
17:00
返回值类型啊好,那课南案例我也写了一些案例,紧接着我们讲了高阶函数,高阶函数呢,最重要的特点两个,第一个它可以接收一个函数作为参数传入,它也可以返回一个匿名函数及可以返回一个函数,那当时呢,我们也讲的,呃,讲了案例了,对,讲了案例了,这个呢,我就不再一个一步一步的念了啊同学们。而且我们讲到这个函数里面,它还可以继续调用啊,调用好高级函数讲了,我们讲了一个参数类型推断这个东西的价值在什么地方呢?就是能够实现很多简写的形式。就是类型推断,它可以让我们这个函数式编程变得更加的简洁,但是有一个前提就是它有应用场景,离开这个应用场景,你就不能这么用了。啊对,离开这个引用场景,你就不能这么用了,好,那么具体来说就是我这说的三点,大家要有一个印象啊,这个呢,我就不再念了啊,看一步一步怎么简写过来的,你看这个例子的map下划线加,你要看得懂这是什么意思了。
18:09
啊,要看懂是什么意思,像reduce一个下划线加下划线,你能看得懂是什么意思了。以后这种写法比较多。好,这个讲完以后呢,我们就给大家讲了B包啊,B包的概念呢很简单。B包就是一个函数,就是你有一个函数和这个函数干什么呢?它和与其相关的引用环境。构成了一个整体,换言之就是你有一个函数引用到外面的一个变量,而且这个变量呢,还跟你这个函数形成了一个整体,那么我们就叫它为B包,叫CRB包的本质很多语言里面就直接打出这个B包,就直接看到这个对象了。咱们班有同学如果了解一些脚本语言,比如说你学个Python,或者学个PHP,你去打一下这个B包,他直接就是一个对象啊,直接就是个对象,所以它本质呢,仍然是一种对象的形式来管理这个B包的啊,没有任何问题。那么B包这个概念呢,在几乎在所有的语言里面都有,比如说你们学的jascript,呃,包括这个像像这个go语言,包括我们的呃,SC都有这个概念。
19:22
啊,都有这个概念,大家要理解,那B包它的价值在什么地方呢?说我们我们学一样东西,虽然把这个概念搞清楚了,那么B包的价值在什么地方呢?我个人理解啊,第一个呢,至少我们可以看到B包的价值,我在这写了一个。哦,我这写了它的一个必包的好处。啊,这这体体会了它的好处,我们好像没写过来啊,我就简单说一下,B包呢,至少可以达到这样一个效果,就是。我们去调用一个函数,但是这个函数那里有参数,我不想反复的传递。我不想反复传递,我想传递一次,那么这个参数呢,就一直为我所用了。
20:03
只要在这个B包,这个函数没有没有销毁之前,我就一直可以用A,我就可以使用这种B包来玩啊来玩好好,那么这个就就说到这儿,紧接着我们又讲了什么内容呢?诶,我们还给大家讲了函数可理化叫corn。函数颗粒化呢,它是为了纪念一个库里的这么一个数学家命名的啊命名家,那么呃,颗粒化这个概念呢,其实在我们将来用的这个过程中会用到这种语法现象,但你们实际去用的可能并不是特别的多,所以说这里呢,我就简单的举了一个案例,告诉大家怎么用的,这个案例是怎么讲的呢?是当时是说比较两个字符串在忽略大小写的情况下是否相等,我们把它拆解成了两个内容,两个任务,第一个。转大小写第二个判断比较,那我是怎么实现的呢?诶非常的简单,我这里用了一个隐私类来实现这个效果啊,当然这如果只是针对这一个题来说,这种函数颗粒化呢,显然是意义不大的,但是它证明了一个什么东西呢?证明了在我们SC里面,它可以就是通过这个分解参数来逐步的完成我们一个大的任务。
21:19
只放在这儿呢,显得有点啰嗦,但是你将来如果放在一个大的环境里面,它还是有它的意义所在的啊,有它意义,至少你要能看得懂,不要看到,诶这个东西怎么回事,怎么会这样写呢?啊,你就知道,或者说诶老师讲过这个是函数颗粒化的一种语法现象,这个你要看得懂。好,这个讲完了,我们讲了抽象控制,那抽象控制这里面的价值在什么地方呢?其实就一点就是说,如果说我们一个高阶函数,它接收的函数类型是没有输入值,也没有输出值的,这种呢,我们就可以直接传输一段代码让它执行。哎,这个我们就简称为抽象控制,那抽象控制我们讲了一个应用案例,就是用抽象控制来实现了一个什么呢?实现了这么一个效果,实现了一个外循环的效果,哎,就使用抽象控制,我们自己来写了一个啊,就是使用。
22:18
二使用这个抽象啊,控制抽象啊,控制抽象实现了什么呢?诶,实现了这个while这种这种语法啊这种语法,诶,那么大家应该看到是怎么来的啊,我也讲了一下,那么同学们还有不理解的地方,大家去好好理解一下。好,这是讲的这个函数,紧接着我又讲了一个大的这个章节,叫使用递归的方式去思考,去编程。那么这点我就讲了这个一些思想上的东西,讲完了过后呢,我们这里证明了一个问题,我们证明了什么呢?就是我这里证证明了一个就是呃速度没有影响,但有个前提,昨天呢,呃上次课呃有同学哈证明了一下,说递归还是有一些影响的啊,有影响,但是是这样子啊,我这说的这个递归速度是否影响,主要是说递归这种机制。
23:16
呃,如果你这个递归有重复计算,那速度肯定会有影响,所以说你在写递归的时候呢,你本身也要考虑这个问题,比如说你求这个阶层的时候,你那个FN反复的重复计算,那肯定速度要慢,那但是这个不是递归带来的是什么,是你。这个写的问题带来的,你明白这个地方啊,就说你这个写递归,你你也不能说在里面反复重复计算,那肯定速度慢,但是这个速度慢不是递归的问题,是你本身这个写的算法的问题,是这样子的,同学们要注意。好,呃,同学们理解一下这个我我说的递归是说递归这种机制并不会对速度影响,但是你重复计算那没办法,那是你计算,计算任务加重了,好紧接着我们就讲了几个小案例,加深了一下认识,好同学们呢,好好去理解一下啊,好好理解一下,那关于上次课的评价呢,老师,呃,这个点评我们就说到这。
我来说两句