00:00
好,打开我们的这个幻灯片呢?我们来看看偏函数的基本介绍,何为偏函数?偏函数指的是在对符合某个条件。符合某个条件而不是所有情况下进行的逻辑操作时。使用偏函数是一个不错选择,也就是说我们将来执行某一个函数时呢,我们先要它满足某个条件。你必须满足的条件我才执行,而不是说我不管什么都所有都这么干。不是,那么第二个呢?偏函数怎么干的呢?将包在大括号内的一组case语句封装成函数,我们就称之为偏函数。那这个概念呢,就是说大家可以想象,偏数将来肯定跟case是有关系的。啊,然后呢,它只会作用于指定类型的参数,或指定或指定范围值的参数进行实时计算,就说哪些类型你要用哪些范围你要计算,你才他才给你干。
01:05
超出范围的就会被直接忽略。啊,直接忽略,那这里还有一个,呃,你忽不忽略也取决于你的处理。那么偏函数呢,它其实会继承一个叫做passion function的这么一个垂字,也就是说我们编写一个偏函数呢,它其实是需要去继承一个特质叫passion function,好,这是它的一个基本介绍啊,同学们,那么我们就来快速入门案例。我们现在呢,使用偏函数来解决问题,大家先看一下这个偏函数,非常简单,我就做了一件事情,就说如果你是int,我就返回错误,否则返回法师。嗯,这边就多了一个is DeFine at,还有一个any apply是什么意思呢?好,同学们,我们不说废话,我们直接来写代码了啊,那么在代码里面我们一个一的讲解。
02:00
好,现在呢,我们写到这一段叫偏函数的第二个案例,所你讲好80。Function。好,我们的,呃,就简写吧。零二没问题。好,各位同学打开它啊,不着急,咱们一点说转述。好,现在呢,我们用偏函数来解决了,使用偏。偏函数解决,那么前面的有些东西呢,我能用的我就不写了,就这个东西我拿过来用用啊,各位同学注意感受一下它的这个威力。好感数为零,那现在呢,首先我们来定义,或者要写一个偏函数定义,或者是啊,定义一个偏函数。偏函偏函数,那怎么写呢?这样子的六。六也就是说在在这么看呢,对他来说这个偏函数好像是个对象一样,那你要六一个什么玩意儿呢?要留一个这样的东西,Pass。
03:06
哎,可以看到啊,我们六这么一个东西,六完了过后呢,这里面需要我们传入两个值,这样要注意认真听讲了,Any。我待会做解释,做做介绍啊。介绍写完了以后,突然发现他打出了一堆红色,为什么呢?说明我们这边有方法要去进行一个实现或者是重写,那这方我怎么来做呢?大家看,把光标停在最屁股后边,输入一个at加,他说implement message,好,里面至少有两个方法,哪两个呢?一个叫做is DeFined ID,一个叫做。Apply那点OK。好点,OK过后呢,我先做一个解释。好,嗯,这个表示什么意思呢?这个表示这样子啊,先写到这。这个表示就是将来这个偏函数输入值是任何类型,返回类型是any。我写在这。
04:05
这这个地方先做一个介绍,就是这个any和int表示什么含义,做一个说明。这个表示。注意听啊,表示这个偏函数,偏函数接收的类型,接收的这个参数类型是N类型,这是我自己定的,然后呢,返回的类型。返回的类型是什么类型呢?是int类型,好,这个第一句话就说完了,第二个。这个写完了后,我们接着把这个代码写完吧,咱们就写啊,如果。啊,如果什么呢?如果这个X。点is instance of。它是一个程。它是一个int,如果为这个是这个int,那么我们就干什么呢?好,如果这个为针,我们就返回一个处。
05:01
二返回用处。TE else呢?好,我们就。返回一个什么呢,For。好,你看我这边写的这个代码啊,写代码里面还做了一点,就是这样子的,其实这里面没没有必要是吧,我们直接用一句话是不是也是可以的,就是直接判断它,我这写了一个if,其实有点多余,直接就一句话就可以搞定,就怎么样写这个东西就可以。啊,就是一个案例类型,我们就写完了,就这一句话就可以搞定。好,那这个写完了以后呢,还差一个,还差一个。这写完就完事了,那么我解释一下这个函数是干什么的啊?同学们注意听,这句话的意思是,注意听,如果。如果返回真。返回针就会去,就会去调用或者触发。啊,最后去调用谁呢,Apply方法。
06:00
然后去干什么呢?去构建一个对象,构建一个对象实例。对象实例如果为false,如果返回一个false的话呢,它这个apply就不执行了。也就是说,如果你返回这个false,我这个apply就不执行,相当于说连对象都不给构建,那如果是false,呃,这方有点,如果是false,则过滤掉这个传入的这个X值,这个X从哪来呢?将来从这来的。啊,如果说就过滤了。过滤好这个说完了第三点,第三点这句话我还没写完。如果这个V1我拿到了,这个V1是从哪来的呢?是从这个V1其实就是个X,就是它传进来的,那传进来之后我做一件什么事情呢?我就直接进行实例化返回一下就行了,那我就很简单了啊,叫V1.asinstanceof。Int,然后我加一。因为你不是要对它加一个一进行这么一个处理吗?好,这句话的意思就是说,如果它调用派方法,我就把你传入这个值加一返回。
07:06
啊,就是apply,我这写的是这个是构建这个相当于是这个构造器。啊,现在一个构造器。构造起干什么呢?对传入的值,传入的值加一返回。的值加一加一并返回,返回到哪去了呢?返回到那个新的集合里面去了,并返回啊,返回到哪呢?新的集合。新的集合。哎,写一下啊,新的集合写完了,写完了,到这个时候我们看代码还有错误,错误的原因没有其他原因,就是因为你没有接收好,那我就写一个叫push简单写啊PARPAR。方。的一个。结束一下,好,这个偏函数我们就做好了,那么这个偏函数怎么用呢?又来了一个问题啊,偏函数虽然你做好了,但是你怎么去用它呢?非常简单,是这样子的啊,使用一下,使用偏函数。
08:07
偏函数啊,使用的时候特别的简单,一句话就搞定了list。点map用不了了。Map它不支持偏函数的,也就是说此时此刻你穿一个map进去,它这地方你看起来好用了是吧,执行就报错。执行就帮助来执行一下。好,当贸易执行过后呢,我们发现它它果然是报了错了啊,我报错原因是一个类型转换问题,好,这个我先不去管它了,我就直接告诉大家应该怎么调用啊,说这样不能再用map了。说明。说明啊,说明如果是调用或者使用吧,使用这个偏函数。偏函数则不能,不能使用map,应该使用什么呢?应该使用connect。
09:01
搞定,那同学们,我不能说我直接上来整一个啊,类似的点connect。你看这个看都看的出来,它是后面有有参数的connect。它这里做了一个隐式转换,因为这个偏函数本质它也是一个对象。没问题吧,没问题,所以说这地方我们看到把谁传进去呢,把这个可爱的偏函数放进去。好O了事就搞定了事搞定过呢,我们可以接收一下list史的二,一步搞定好,同学们可以看到,现在呢,我们再输出这个历史的二。就可以看到一个非常好的一个现象了,啊,那就是我们要的东西都出来了,那以后你这个逻辑要增加,只需要改这段代码就行了,好同学们,我们执行一下走。走好,我们运行,我们看到这些结果跟我们想的完全一样的啊,那么我再说一下这个流程啊,同学们。偏函数里面也做了,就跟我们那个隐次函数一样,做了很多的这个包装,底层做了很多包装,你看啊,我这掉这个地方,它就掉它调它调它里面,它它这里面有有一个什么判断呢?如果这个为针它这样子的啊,它这个流流程偏函数流程,我再说一下执行的过程。
10:17
说明说明。说明一下偏函数,偏函数的执行流程。执行执行流程简单说一说第一步。老规矩,它仍然在底层汇聚,遍历历史的里面的每一个元素,这是肯定的。你你你不编列,我怎么知道你是不是真的,所以说这个地方一定会被调用几次呢?大家猜一猜的出来,这个is DeFine a一共会被调用五次。调用这是这个肯定的,这个地方只会被调用四次,因为它里面有个包装,它先类似于在这个呃,SH里面有个这样的流程,如果怎么这样,Else怎么怎么样。说如果为真,我就去执行apply,如果为假,我就不执行了,大致有这么一个逻辑在里面啊,那么我们说一下流程是这样的,第一步,便利。
11:08
是它会便历哪个呢?历史的2LIST史的就是你这个list的所有元素。啊,所有元素。好,这是第一步,第二步,然后然后调用,调用偏函数的。这个方法。啊,因为你在调用的时候,这个偏函数呢,本身会接收一个N,这个N就是你这个list里面的东西,List什么都可以传。啊,你就编辑出来元素,我不管什么东西我都接收,他就干什么调用它的第是DeFine啊DeFine这个地方类似于这样子啊,类似于这样一个逻辑,我就直接写了。就拿掉if偏函数里面的这个值,这个值它会传一个什么呢?就是你这个list里面的这个单个的元素,我就截断,呃。写段那个呃,伪代码啊,单个的元素。
12:01
单个元素。单个单。单个元素,然后这方它有可能为针,如果这地方为真,它就会去调用,紧接着调这个偏函数里面的apply方法,并返回这个结果。啊,调用什么apply方法。啊platform,那么ELSE10呢就就不做了,L就相当于。不不去调用,如果是不是这个不为帧就不去调它了,所以这地方类似于有这么一个逻辑,但是你这个apply的时候呢,它仍然会把这个单单个的这单个的元素还传进去。传到这个apply,作为我们构建这个这个对象的一个参数传进去,如果你这地方为假呢,没没有处理,所以说大致就是这么一个流程,那么每次每一个呢,就会返回,返回这个元素,这个值是什么呢?就是你返回值,返回值是什么取决于你这个apply。那这个apply我用的是类型推导,那你这就是个int,好,相当于这个就有个返回值,我们认为是一个int,然后这个返回的一个值,比如说啊。
13:04
我就随便写一个,比如说这是一个新的element,然后这个element完了过后呢,Element完成完了过后呢,它会把这个element再重新包裹到一个新的。那个集合里面去第三步。啊,每得到一个,每得到一个这个element。就新的新的element,它就会把它放入到啊,放入到新的集合中,最后返回。最后分好就是这么一个流程,那么我们来测试一下老师分析的对不对啊,首先我们认为这个地方应该会调用四次啊,调用五次,我们来看一下,做一个证明。来看一下。好,首先我们把这个打出来看一下是不是跟我们分析的一模一样,大家输出。啊,这边呢,我也输出一个。好,我们看到底V1拿到了几次,就是看看是不是为真采取调。好打到这里,那么这个V1我们收我们玩一把啊,执行一下,上面应该有五次,下面应该有四次。
14:05
好,我们看到来第一个V1正确,V2正确,V3正确,第第4X等于哈时没有机会再调用这个方法,果然如此,因为你这个地方他在底层里面走的时候,他发现这个为甲就不去调play方法了,好,解释完毕啊,解释完毕,相信这个大家就理解很清楚了。那有的人说老师为什么map不支持呢?Map它很傻的,Map它是没有这种过滤机制在里面,这个这个connection有点类似于它综合了map和fair的一种结合使用。这个大家理解很清,其实他这个connection有点类似于把map在底层,把map和filter结合在一起使用。对吧,你看在这边带这个逻辑了,带这个逻辑了,很好理解,很好理解,好同学们,那关于我们这个偏函数这个应用呢,我们就先讲到这里啊,这个这个代码呢,也还是呃,很明白的,我把这个偏函数的快速入门给同学们板书到这里。
15:02
好,刚才我们讲了一个什么玩意儿呢,就讲了一个偏函数的什么呀,快速入门案例,一个案例,我们把这个东西给他搞定对吧?啊具体来说代码呢,我就直接给大家反述到这里完事了啊,看一下啊,我这里也做了很多的说明。把它放到笔记中好,最后我们把这个代码呢,再做一个简短说明,刚才老师已经说过了,再念一遍啊,再念一遍好,针对刚才我们讲的这个part function呢,我们再做几点说明,我这里其实前面已经说了,再念一遍,首先呃,偏函数呢要构建这个特质来实现。啊,本质这个函数你可以理解成就是一个对象,所以说为什么我在前面讲的时候,呃,SC一切结尾对象,包括函数都可以看出一个对象很厉害的啊,那么呃,引用的是passion function的一个匿名之类。匿名之类,那么构建偏函数这个原代码大家可以看一下,我给它一下页,这个东西大家看一下吧。
16:07
你看它就是一个特质。啊,大家看到的减加这个叫呃逆变斜变,后面我们再说这个事啊,就是泛型的逆变和斜变啊,那么下面还有这个,刚才看这个我们写的,对于这个是吧,这些方法的一些一些重写,这它下面都有像S有些还可以用。啊,比如像这里面的一些方法,我们也对它像这个看到没有is DeFine as,哎,这个呢,我们就把它重写了一把,好当然它下面,它下面还有一些其他东西,我就不不去追了,好这是它的一个底层,那么构建偏函数时,参数传入的形式,这个any和int,就这两个值是你自己指定的,就是这个值和这个值到底是什么由你的来决定,比如说你接受的假设,我就指定这个偏数只能执行接受int,好,那你就写int。你如果说我偏函数接收可以是任意,你就按例返回,是什么类型,你也由你来决定,如果你这个类型不匹配,那你这个代码肯定是要报错的啊。
17:05
好,第一个表示参数类型,第二表示返回参数。当使用偏函数时会变利结合中每每一个元素编译器会执行,先执行if DeFine,如果为帧,执行apply,构建一个新对象并返回,如果执行的1DEFINE I是个false,过滤到这个元素。即不构建新对象,Map函数不支持平函数,因为map的底层呢,它是把所有元素遍历。啊,这个没有过滤机制,那么我们调一个偏函数需要用connect函数,好这个整理我们就到这里,啊,同学们偏函数的一个小结,老师呢就给大家讲完了。小杰。就是偏函数的小结,我们在这里呢,也给大家来一个简单的整理好,就是偏函数使用的小结。来一个标题三对吧,我分别讲了这么几点,第一点。对吧。
18:00
第二点好,第三点。第四点。好,同学们,第五点第六点。好,最后一个调用偏函数,用collection,好到此偏函数的这个快速入能和小节我们就讲完了。
我来说两句