00:00
我们已经了解了B包的基本概念和它的底层原理,那接下来呢,我们就在代码里边再把B包的应用给大家详细的展开,怎么样理解这个B包的产生和它的基本的用法,那我接下来还是去创建一个scalela的object,现在我们要测试的是呃,S的零九,我们要测试的是B包啊,以及后面我们要测试的这个理化,B包英文叫做closure,那理化叫做cur,先把它创建出来,然后接下来那方法里边,首先我们先写一个最基本的。嗯,像我们前面啊,两个参数,两数求和的一个函数,一个A,我们先定义出来两个参数,一个是A,另外一个是B,都是int类型,求和返回还是一个int类型。那里边的实现当然就是返回一个A加B了,那本身是非常的简单,那大家知道这个函数其实是非常通用的啊,它可以计算任意两个整数相加的和啊,那所以说它对于这个兼容性问题是处理的非常好的啊,通用性非常的强,但是这种实现它通用性强呢,它代表适用性就比较差。
01:26
什么叫适用性差呢?就是我们每次用它的时候,都必须要传入两个参数,每次都得传两个参数,那我们当前只是两数求和,那假如说我们实现的这个爱的方法是很多个数求和呢?如果是200个数求和,2万个数求和呢?大家就会知道,我们每次调用的时候,当然就是要把这2万个数全部都要加一次了。那其实我们就会想到,在有很很多场景下啊,有可能很多加数它都是相同的,比方说这2万个数里边19000多个数可能都是都是相同的,更改的只是极个别的一些数,那每一次我们调用的时候呢,呃,你最后还是要把2万个数全部都加起来,这显然整个的这个效率就不够高嘛。
02:15
所以呃,这就相当于我们用这个钥匙开门一样,如果我们配的是直接当前这个方法,就相当于一个钥匙啊,如果我们配的就是一把万能钥匙的话,你想要去开2万个门,所有的门都能打开,那当然开每一个门的效率可能就没有那么高啊,那所以这就是我们的一个考量,假如说我们遇到了这种大规模的数据,在大数据的场景下,很多数据有可能是类似的,相同的。这个时候我们可能要对于这种场景做一个规约,就是让它的适用性要更强,在很多数据相同的情况下,我可以把它直接就先算起来,然后接下来呢,只去考虑不同的那些,再做一个叠加不就完了吗?哎,所以接下来我们就考虑到。
03:04
可以考虑,比方说对于这个例子而言啊,我们就考虑固定一个加数,然后只改变另外一个加数的场景啊,就是我们接下来要做的第一步。考虑固定一个加数。啊场景,那比方说我们先固定一个加数,假如说一个加数就就是四,我们已经定死了,这个完全没有问题了啊,那所以这里边我们可以认为这个A就已经是四了,那当前的这一个方法就变成什么呢?函数变成什么样了呢?啊,那同样这个A就知道A就相当于一定是。四跟另一个数相加了,所以我干脆就叫做by four,那这里边我们传入的只有一个参数了,比方说还是传入一个我认为A是四返回一个int类型的值,那我们这里边写的实线就变成了A是四,四加B,就是当前的这一个定义啊,那同样,呃,大家知道这个如果要调用的时候,我们就直接传一个一个参数,然后就可以得到结果了,对吧?啊,那如果要是说我们把它扩扩展到2万个数相加的话,我们当前定义的有可能就是19000多个数都是相同的,然后参数就相当于只传不同的那些参数就可以了,之前的那些相同的那些参数呢,我们就把它计算出来的和直接定死放在这里就完事了,这这是我们能够想到的啊,扩展当前的这个适用性的一个做法,但是大家会想到,哎,有些场景下呢,我们固定了一。
04:50
加数或者固定了一些数,这个是比较好用的,但是往往这种场景我们还要做进一步的扩展。那就是当前这个加数,一个加数是四,那另外有一些场景呢,他们也可能也是固定的一个加数,但是这个加数不再是四了,有可能变成五了,那这个时候怎又又该怎么办呢?接下来我们考虑的是。
05:14
扩展固定加数改变的情况,也就是说我们还是要固定一个加数,那固定的这个加数呢,有可能是四,有可能是五,那我们接下来就除了at by four之外,还得再来一个at by by,同样这个实现也是一样啊,B作为一个参数传入进去,具体的实现就变成了五加B,哎,这个大家很容易能够想到,就是这样去做嘛,接下来问题就是又来了哈,那如果我们的场景确实很少的话,这两个对吧?呃,就是很常见的这个加数,要不四,要不是四,要不是五,那这个就没什么问题啊,我们就直接写两个函数就搞定了吧,但是假如说我们现在要扩展的这个场景越来越多了呢?
06:09
固定的加数又有很多种情况呢,那就比方说像我们这个2万个数要做加法的时候,呃,我们有很可能大部分场景19000多个数都是相同的,但是呢,他们的相同的情形又有很多种情况,可能又有1000多种,1万多种这个场景,难道我们要定义1000多个函数,一万多个函数分别去处理这种特殊的场景吗?啊,所以大家就会发现了,如果说我们现在把它的这个通用性变变得差一点,适用性变得更强的话,这就相当于我们配钥匙的时候,给2万个门,一万多个门,2万个门每一每一个门都单独的配了一把钥匙,就专门针对这个问题去处理这个场景,它针对这一个问题解决起来是快了,但是呢,你要配的钥匙多了呀,你要定义的函数更多了呀,哎,所以接下来我们要考虑的就是能不能找到一个平衡点,让当前的通用性和适用性。
07:13
得到一个全得到一个均衡呢,哎,所以接下来我们考虑的就是我们就是将固定它数作为另一个参数函数,但是大家可能会想到,你如果要是固定加数也作为参数传入,这不就跟我们最初的两个参数一样了吗?哎,现在不一样,现在我们是把这个固定参固定加数作为的这个参数作为作为第一层参数参入什么意思呢?啊,也就是说现在我们要定义的这个场景。
08:05
那是要分别传两个参数了。就相当于我们在调用的时候呢,是先传一个固定加数,然后再传另外一个啊,就是可能变化很大的那个加数,所以这样的话,就相当于我们第一层传入的这个固定加数,它的场景可能比较少,你如果要是有扩展场景的时候,那你再调用一下这个第一层改变一下这个参数,得到一个,呃,对应的这种场景,相当于我们可以配一组钥匙,对吧?啊,就是相当于我们要开1万个门,我们可以配上100把。呃,这个不能叫万能钥匙,应该叫百能钥匙啊,就是一把钥匙都能开100个门,那么配100把钥匙就可以开这1万个门了,这就相当于是我们所说的通用性和适用性的一个平衡。啊,那这里边具体来实现,又应该怎么实现这样一个功能呢?那其实大家知道最后我要做调用的时候。
09:04
分层要传入两个两个呃参数,那不就相当于我类似于调的时候,就应该是这样的两次调用嘛,对吧?啊,就是前面先传一个加数,固定加数,然后后面呢,再传另外一个不固定的更加宽泛的灵活的那个加数,所以接下来我们要定义的这个函数啊。单独的定义一下啊,比方说我我现在还是先定义成at by four吧,前面要做区分,我把它叫做a by four,一会发现,呃,既然是ADD by four啊,我现在就先不传参数,我先把那个A单独的先列出来,先看到这样一个写法啊。本来我们想要的最后结果就是一个int,那现在呢,我因为想要分层传入,所以我第一层其实应该是返回一个函数,那函数呢,这层那是一个int作为参数输入,然后返回int一个结果,这样一个函数,哎,所以呃,就是一个函数的嵌套嘛,就是我们前面说的外层函数要以内层函数作为返回值返回。
10:17
那所以现在我们ADD by four one啊,这里边其实还是把第一个参数定死了,我们在里边它定死等于四,然后接下来呢,在里边再去定义一个派的这样一个函数作为参数传入,它的返回值是应一边,当然就是一个A加B了。最终我们下面要返回的其实是I的一个函数,大家看目前我们实现的这一个函数啊,跟前面相比的话,同样还是固定了一个加数作为四,但其实我们已经不再是直接写死在这里了,而是在外层其实是有一部函数调用的,在这里是定义了一个局部变量,然后把它传给了内层函数,然后做了一个加法。
11:12
那所以如果我们要进一步去把它做一个提取的话,那自然就可以写成这样的形式了,我们把它写成a by four,哎,你要作为局部变量,而是作为参数直接写在这里,哎,那同样里边的这个实现是一样的ink啊,那里边我们就不再需要。注意这个局部变量A了,直接定义B就可以了啊,那所以大家看这样的一个写法,就是我们所说的啊,以内层函数一个函数作为返回值,定义一个我们外外层的函数。所以写到这一步大家就发现了,这不就是我们所说的B包吗?或者上面这个这种形式就是我们所说的B包,内层函数用到了外层函数里边的一个局部变量,或者是它的一个参数,所以为了让我们在调用的过程当中分层调用,在第二步还能够访问到外部的变量,那需要把这个局外层的局部变量跟内层的函数打包在一起,保存到一个函数的对象实例里边,存放在堆内存里边啊,这就是之前我们提到的B包啊,那所以到了这一步,我们已经知道要调用的时候怎么调呢?你做一个print line啊,那就是ADD by four two,里边含一个,比方说传一个35。
12:41
然后后边哎,传一个24,哎,传两个参数分层传入就可以了,但现在其实我们已经不应该叫a by four了,因为大家看这个A已经完全提炼出来是一个,也不是一个固定的参数了,对吧?呃,就是第一步我们这个固定加数也作为一个可变的参数传入了,所以这里面其实应该写作s by a。
13:07
下面我们这里边用的时候,就是XBY1N15 24,那我们如果直接去运行一下的话,当然是可以得到对应的结果,就是两数求和得到了59。那像我们之前定义的那个by four啊,如果要是现在用这个来写的话,我们定义一个I by four,那应该怎么我们得到这个a by four呢?就是怎么样定义固定一个加数是四呢?其实非常简单,我就直接by a给一个四就是a by four嘛。接下来我再去调用的时候,是不是直接基于这个a by four,然后再给一个参数,那就相当于是基于四去加另外一个参数啊,哎,所以接下来你要扩展的话,那么a by five同样也是,我只要调用一下a by a传一个参数就可以得到它了。
14:02
就是我们在配钥匙对吧,而这一把钥匙有可能都可以开很多个门,我在单独调用的时候,那就是line at by four four,然后传一个,比方说传一个13,就是四加13,那如果要调用at by five。不,里边如果传一个25的话,那就是五加25啊,所以这种调用方式就能看到一个通用性和适用性的一个结合,一个平衡的过程,这就是B包一个最明显的最典型的用法,呃,那当然了,呃,接下来我们会想到这种实现看起来还是有点复杂的,那我们首先可以把它做一个拉达表达式的简写,那达表达式简写,这种简写的方式也非常的简单,那就是呃,我们把这个叫做ADD by。
15:09
Ae本身我们之前的这个实线啊,先把它直接copy过来。如果要写成拉德表达式,我们知道既然是要返回一个这个函数吗?直接删掉了,跟它的这个名称没有什么关系啊,直接把这个拉姆达表达式写出来,直接返回就完了,那拉姆达表达式不需要再有这个函数的返回值类型,只要有这样的一个箭头逆出来就完事了,那当然了,第一步我们也可以。再把它做进一步的简化。因为在这里我们可以看到当前的A。里边的这一个B,它的类型其实在返回值的类型里边已经定义出来了,所以这里边我们可以把它省略掉。
16:01
直接可以省略成这样,而且进一步A加B,它只是这一行代码,也可以直接写成这种形式。当然了,最后还可以更进一步,我们应该还记得,如果说当前这个参数在后边只出现一次的话,可以直接把它写成用直接把它省略掉,然后用通配符下划线做一个替代啊,所以当前我直接把这个全部删掉,直接就是A加下划线。就是最简单的一种简洁的一种表示啊,当然了,我们这个划括号,因为只有一行嘛,可以省掉,这就写成这样了,所以大家看这个所谓的a by a就是什么呢?啊,就是A加下划线对吧,所以看的非常的明显,就是传一个参数,然后呢,呃,第二个参数我还没给,但是接下来肯定还得再给第二个参数,对吧,就表示这样一个含义。
17:01
所以如果大家适应这种语法的特性的话,其实可以看到它是一目了然的,就可以把它定义出来了,呃,那所以接下来如果说我们调用同样调用这个a by a3的话啊,那么我们这里边测试的这些也都可以把它直接替换过来。比方说我们这里边定义一个a by four3和a by。三,那这里边我们都用这个三来做一个替代。提醒一下,你看结果是不是跟之前得到的结果都一样,大家看是完全没有问题的,就是四加13和五加25。这就是我们所谓这个B包的用法和它最终这个用拉姆达表达式简写之后的形式。
我来说两句