00:00
好,那我们关掉这一个章节啊,我们打开新的章节。那新的章节在哪里呢?在这里准备好了,就是呃,讲一下函数式编程的高级部分,那么我们有这些知识点过了再来看函数式编程,就理解的更清晰一点了,好,打开它。呃,那么我们来看看函数式编程的这些内容有哪些,我们一个看首先啊,首先先给同学们讲一个重要的东西,叫偏函数啊函数,那么偏函数是个什么意思呢?如果用我们这个英文来说,它是这样写的,Part。Partial function啊,Part方式叫偏函数,怎么理解这个东西呢?老规矩,看一个案例,加深对它的理解,说现在呢,有这么一个需求,同学们注意听啊,这个需求呢,很简很简单,是这么一个需求,说给你一个历史的集合。
01:01
给你一个历史的集合,里面呢有1234,同时还有个ABC,怎么算?啊,我供应商设计的,那么要求的完成什么功能呢?将list中所有数字加一并返回一个新的集合。即要求忽略掉所有非数质的元素返回的新结合,比如是2345,这个对我们来说能不能解决呢?好,同学们,这个对于我们来说其实要解决是没问题的,那么我们来谈谈几个几个概念啊,需求已经说出来了,我们看如果我先用第一种解决方案,大家应该可以很轻松的完成,就说我用map加filter是不是就可以搞定?我先把它进行一个过滤,然后再map,但是这里面呢,还是有些麻烦事,你会发现这个用起来比较麻烦,虽然成功比较麻烦,那么我们来走一下啊,我们就以刚才的这个需求来解决这个问题,好打开我们的。
02:02
新的章节,因为这是新的章节,我新建一个文件包。要chapter。幺三。注意听好幺三呢,我把刚才这个案例给同学们写一下,就是刚才我们说的这个偏函数的第一个案例。Part function。OK,零一,因为后面还有别的案例,所以说给他来一个编号零一。主函数,那么我先把需求给各位朋友拉过来。啊,需求。也非常的简单是吧,很简单很明了。就是呃,处理它的这么一个呃新的集合,但是呢,你因为你加一,你不能对ABC加一嘛,好,现在我们使用第一种思路,思路一。是意就是map应该是filter filter加map的这个方式解决。当然这样解决肯定是可以的,而且可以解决,但是我们来体验出它的优点和缺点啊,那各位朋友那开始写了,首先呢,我就简单一点,先把这一个呃集合给同学们拿过来,这个大家应该能看懂。
03:13
首先你啊同学们,现在我们直接加是肯定跑不起来了,假设你按照以前那个套路说,老师我直接卖,直接这样写行不行?比如说我这里有个函数叫F1,注意听。F1我接受什么类型呢?你想你现在这个地方要接受个类型,你不知道接受什么类型,因为你用这个,如果你接受int,你是它是传不进来的,比如说按照我们以前传统的写法,同学们可能这样写的啊,说int,然后N加一,你看。这样写你根本就跑不起来,也传不进去,因为你这指定是int,那看我们这个方法你就用不了。点map。因为这个map这帮人家传的,要求传的是什么类型的,你看啊,Map写完了,你把F1你是放不进去的。啊,放不进去。好,放进去他报报错了,报什么错呢?大家看这里,他说啊,我希望一个any单传的int,因为你这边你这边有个字符串,它就自动判断,判断是any那些,除非你把它去掉。
04:10
如果你去掉过后呢,这个当然是可以的,也能够得到2345,但是人家就偏偏给了你一个支付,算麻烦就在这里,好,这个时候你怎么解决呢?显然你肯定不能这样傻乎乎的用了,所以说我们思路干什么呢?先过滤。先过滤,再迈步。好,注意听啊,我给他讲完了过后你就会知道这个偏函数的优越之处了。那既然你要先过滤,那我先写第一个函数,我们先这个函数先不要干这事,先让他来完成一个过滤的工作,所以说呢,我先接受一个案例,大家能看到这个东西吗?Any,因为你认为只能接受any,所以说我就想告诉我返回一个。是吧,啊哦,我要返回一个布尔类型啊,布尔类型对布尔类型,那这样我怎么怎么来判断它是我们要的呢?是不是就用一个if else就可以搞定了,最简单就if,如果说n.is对吧?当然我们还可以用模式匹配,待会再说模式啊啊同学们看到这可能有些同学呢,诶说老师用这个麦匹配不是更好吗?待会再说这事,我们先用最。
05:19
最传统的菲尔加map完成,那这个地方如果它就是一个int。好,那么我们就返回一个处啊,其实就这样写就完了,是吧,就这写就完了,就不用再写别的了,就是一句话就搞定好,那现在呢,我的思路就变成这样子了点。The啊filter,那filter里面呢,我们传入刚才写的这个f fe,这样子同学们可以看到,当我当我执行这个输出的时候,你们可以看到它返回的呢,是什么类型呢?同学们看返回的就是1234。12348A。这个地方同学们看到确实1234,但是注意啊,这个1234它会怎么做呢?接着往下看,既然拿到这个东西过后,同学们可能想,诶,老师赶紧写一个DF,好,这个地方大家看一般的人都会想,诶,那我接收一个int。
06:14
接收一个int,然后我再给你返回int,诶这样应该就可以用了,能用吗?显然是用不了的啊,你N加一这个是可以的,但是你这做完了以后,你想马上迈,你会发现他继续给我们报错。哎,原因是为什么,哪个同学告诉我。哎,对呀,就不是过滤完了,我不就留下印的了吗?为什么我还传不进去呢?原因有同学知道吗?诶,Very good,有同学说的非常的好啊,因为你在这个list的定义完了过后,其实这个list的泛型就是any了,而你认in特肯定传不进来的,又麻烦这事,所以说你还要先迈步将其转成int才才能用,你看多麻烦了,虽然能完成,但是麻烦,那也就是说这个时候这个F2你还用不了,你先得搞一个这个,再将一个什么,将我们的这个any。
07:05
转成一个int的一个map。但是不管不管怎么样,还是能实现。啊,那这个对对我们来说也很简单,我写个DEF好,这是我写个F3吧,因为因为这个F2已经被占用了啊,注意听讲啊。所以大家要知道为什么这个偏函数的好处。好,那现在我写到D f3。好F3,我这个时候呢,先要接受N力,因为你这个过滤过后是N力嘛,所以说我还是N力,但是我给你返回。我这个我给你返回一个int。那我怎么给你返回一个int呢?也很简单,我直接这样写。As。对不对。这样呢,就转成一个啊,转成一个in特,那这样子我们方法就出来了,先再迈一下。卖不走呢,把F3穿进去好,下面代码就一马平川,诶,这个地方是F3。
08:04
那。哪写错了?好这呃就写成这个东西了啊,不知道怎么提示这个东西,好这样写进去就可以了,同学们看我们目前这个效果就确实已经出来了,但虽然麻烦,但是总总原才是搞定了,对吧,还是搞定,那么这个时候我们这个时候再来输出就应该是2345就拿到了走。好,非常的好,你看对方搞定,诶搞定了,确实是把这个过滤的,二且还是搞定了,好,第一个方案我们就讲讲完了,第一个方案呢,虽然解决了,但是我们可以看到它的问题,其实就一点太啰嗦了,对吧,你还只是对一个类型过滤,那将来类型多了怎么办呢?你都这么去写太烦了,所以说我们这时候这个结论呢,虽然可以解决,但是稍显麻烦啊,可以解决它的好处是就是虽然。
09:01
A,虽然可以解决,虽然可以解决问题,解决问题,但是呢,问题但是啊,但是比较麻烦啊,比较麻烦。啊,不够高效啊,不高效啊,这个第一个我们就说完了,那这个时候同学们肯定会想,诶老师,我们还有一个思路,你不是刚刚讲过match匹配吗?哎,这个时候我们用它是不是也可以解决呢?答案是也是可以的。第二个思路。模式匹配,模式匹配呢,大家看我这里写了这么一段代码,大家看是不是应该更高级一点,你看我这里写了一还是这个历史的,我这里写了一个I的one。我接收什么呢?呃,这这个肯定这个还不行,这个用不了,因为你是硬的是吧,这用不了我直接改进的这个啊,直接看这个案例,你看我直接接收一个案例。我接收一个N过,我帮你加一下不就完了吗?对吧,因为如果你是这个int类型的,我就加一加一返回去,当然我我可以返其他类型是吧,加一,然后呢,这个如果你不是这个因特类型,我什么都不做吗?诶好像也可以,我们看看这个用模式匹配是不是也能达到效果呢?对,如果这个能达到效果就特别棒了。
10:18
啊,如果这个人达到效果就特别棒了,那么现在呢,我们用模式匹配来解决这个问题,来,朋友们。好,各位同学看呢,我们用思路二。A、实录二就是我们活学活用。那思路二呢,我们写一个这个模式匹配,诶这个代码我就不写了啊,咱懒得写了。啊,就这么一玩意儿,这什么可写的,直接写到这,这是一个。一个方法用模式匹配,这里面模式匹配的一个函数。那干什么呢?它可以接受any,返回一个any。啊,返回一个,那现在呢,我们来玩一玩,看看这个行不行。还以这个为例,还以这个为例,那现在呢,我结束一下啊,同学们看Val list的二等于list的点map。
11:08
好,Map,因为是N嘛,所以说我把这个历我我直接把这个I one2放进去,应该也是no problem,诶确实确实不不错,还行,没有任何问题,你看我返回的就是any,好,现在呢,好像问题解决了,但是我们输出的时候发现有一点东西很不爽。哎,我们输出我们打开LIST2,我们看它到底是不是得到了2345呢,同学们请看执行效果。当我们执行完了后,我们发现这个效果确实是很接近的,但是很讨厌的是他那一个空的,那有的学老师这个空的怎么办呢。的不好处理,因为你别过滤,因为你这个空的呀,你在这进行匹配的时候,这个地方没有写任何东西就代表空,但有同学老师你给我返回一个int不就完了吗?注意啊,你这返回这个int。
12:00
你这个部分一个下面这个就会这个地方就会报错,因为这个地方这个空转对不了,你这样执行它会报错的啊,直接给你报错。你看直接就走不下去,他说放在一个unit,但是要求走不了,所以你那这只能写个案例。啊,所以这就很麻烦很麻烦,就说你不能他虽然是呃匹配不上,但是他默认会返回一个空,除非你在这拆过滤师,那不是很无聊吗?说这个模式匹配呢。也不能达到一个特别优的一个效果,所以说我们又得出这么一个结论,就是点评一下啊,就是就是小结一下,虽然模式匹配也很接近了,但是呢,还是有瑕疵啊,有瑕疵就是这里虽然虽然使用这个模式匹配啊,匹配比较简洁,比较简洁,比较简洁,但是呢啊,但是还不够完美啊,但是不够完美好。
13:01
呃,那么现在讲了两个方案。显然都是为了我们讲偏函数做准备是吧,因为偏函数它就能很完美的解决这些问题,第一个很简洁,第二个还非常的这个高效,好,那么我们就推出偏函数了,那现在呢,我们先把这个,呃,刚才讲的这个内容先做一个板书。好,我们刚才已经提出了这个偏函数的,呃,一个需求吧。好,我写到这里,叫偏函数part function。好,这里面我们新这这个章节讲的是函数式编程高级。好,来一个标题,我们是标题一是第13章,那刚才呢,我们已经提出了偏函数的概念。A平函数的概念,那我该用什么事情呢来做一个小标号,这里首先我做了一个基本的一个需求说明啊,提出。
14:03
提出了一个需求,引起思考啊,引起思考。引起我们的思考,OK,那具体来说这个需求是什么样的呢?就是刚才老师写的这小段代码对吧,所以说我们通过一个问题切入啊,同学们,呃,其实效果特别好。啊,因为你知道他为什么有吗?啊,这是第一个需求。你就知道它的价值在什么地方,好提出了一个需求,那么我们也提出了两个解决方案啊,我们有两个解决方案,第一个解决方案,大家看到我用的是map。哎,卖这个集合来解决第一个方案,就是我们第一个方案。这是第一个方案。好,我们又提出了第二个解决方案,第二个解决方案呢,是就是解决方式,第二解决方式呢,我们用的是模式匹配,模式匹配。好,也给大家写到这,把这个代码给大家整整过来啊,第一个是呃呃,用用这个map加就少写了一句话啊加filter啊,就filter加map吧。
15:07
菲加map的形式来处理的,那代码呢?给同学们阐述一下。啊,这个地方是这样解决的啊。干脆写在一起吧,啊,这个应该能看懂。两分懂,好,我把整体代码呢放到这里。来。给大家插入一个小表格。那具体来说呢,这个地方我们有两种方式啊,大家看一下第一种方式思路一啊,这是思路二的。思路二的,这是思路一的,大家应该能看懂。OK,好,关于这个偏函数的引出,我们就先先说到这里。
我来说两句