00:00
我们已经了解了KDA当中匿名函数的定义和用法,以及它的一些简化规则,那我们总结一下的话,就会发现所谓的匿名函数其实就是没有名字的函数,就是省略了在函数定义的过程当中,省略了函数名和前面DEF关键字的函数。啊,当然它具体的定义还有一些小细节,语法上跟普通的函数定义不一样,就是后边我们是要用一个等号加大于号,有点向向右的箭头来表示,这是一个匿名函数拉姆达表达式,前面还是参数和它的类型,后边是函数体,这里大家要注意一下匿名函数定义的时候呢。没有函数的返回值类型啊,所以这里边我们前面就是参数,后边就是函数体,中间用这样一个向右的箭头连接在一起就可以了,这就是匿名函数的一个定义的语法,那当然了,前面给大家做的介绍这样一个例子,可能还是不够明确啊,有点抽象,我们当时给大家提到了,就是这个F在定义的时候呢,它是把数据已经写死了,我们一般情况函数是要传入参数,传入数据,然后具体的操作在这个函数题里边定义好,而现在这个F呢,它是反过来数据已经定义好了,写死在这里,而要做的操作是通过参数一个函数传进来的啊,那我们再用另外一个例子给大家做一个详细的说明,可能会理解的更加深刻一些啊。那接下来我们要做的这个一个实际的事例啊。
01:38
实际的事例,那就是我们第一个二元运算函数,这个函数呢,我们是把数据都已经定义死的啊,就是只操作,只操作一和二两个数,但是具体他俩要做什么计算,具体运算。
02:12
通过这个我们是不指定的啊,通过参数传入,哎,所以大家就想到了具体的运算方法,要通过参数传入,就相当于我们要传一个函数进来吗?啊,而在这个本身我们定义的函数里边,一和二这两个数是定义死的啊,所以主要就是这样的一个操作,那接下来我们看看该怎么声明啊EF我们把当前这个叫做to function2元函数元运算,然后one and two,因为它是定义死的嘛,我们函数名就定义好了啊,那里边一和二显然就不应该在参数里面传入了。是在里边直接写死了,这里边我们要传的其实就是一个方式,一个函数,那这个函数啊类型等一下我们再写啊,最后我们得到的一和二都是整数嘛,我们最后二元运算加减乘除,我们最后还是让它得到一个整数吧,里边呢非常简单,就是套用这个方式,然后把一和二传入二元运算嘛,那接下来这个方式到底应该是个什么类型呢?那我们看的很明显了,传入的参数一和二显然是两个参数,而且都是硬的类型,这是它的参数,所以之前我们这个函数类型大家看跟那个拉姆代表是很像,只不过呢,就是只有类型没有对应的参数名称了啊,那前面都是类型,然后后边呢,用这个拉姆表达式的这个箭头在这儿返回值类型,返回值类型又是什么呢?哎,那大家知道,当前我们的最后要返回一个int类型,那我们这个表达式最后一行表达式的这个返回值。
03:51
不就是整个函数的返回值吗?那所以这个fun放的返回值是不是也就应该是int呀?哎,所以也就是里边你传进来一个操作,要得到什么样的类型,我最后就返回一个什么样的类型。所以这里同样也是一个应。
04:08
那把它定义好了之后呢,接下来我们就可以定具体的一些操作了,比如说我定义一个ADD的操作,ADD的操作是什么呢?哎,我们就可以定义它应该可以直接用一个。LA的表达式来直接把它定义出来,比方说这个LA表达式,我们就是想让两数求和,那不就是两个数相加吗?那这个非常简单,一个数叫做A,一个数叫做拉姆达表达式,我直接写参数,没有名称。后边是这个箭头,最终的这个。函数体实现最后返回的不就是A加B吗?哎,这就是A啊,那同样我也可以定义一个减M,那就是两个参数A1减一,当然这里边我们的要求是前一个是被减数,后一个是减数,如果要反过来的话啊,那就需要去单独定义了,那所以接下来我可以直接print line打印一下,要用的时候你这呢,不,Function one and two,直接传一个A,这就是一加二结果,或者我们直接传一个minus,就是一减二的结果。
05:26
啊,所以大家看这个其实是非常明确的一个呃含义啊,这就是我们定义了一个一和二写此数据,然后要传对应。就是把这两个数做操作的那样一个函数进来,我们定义了这样的一个函数,然后接下来呢,你把对应的这个操作分别定义出来,就可以作为参数传进去,去做调用了啊,我们定义了一个加的操作,定义了一个减的操作,这都是一个函数,拉姆达表达式,一个函数,那接下来一传进去,那就是一加二和一减二。
06:00
我们可以运行一下。前面还是加一个分割线。我们来运行,那你看是不是可以得到,果然一加231减二负一完全没有问题啊,这就是关于这个拉姆达表达式比较常见的一种用法啊,我们利用一个二元函数两个参数给大家看的更明确一点,然后接下来呢,既然匿名函数我们之前不是说可以做简化吗?啊,匿名函数化,因为前面我们这里还是为了让大家看的清楚,还是把这个匿名函数给了一个名称,然后又把它传进去了,那其实我们知道啊,这里边写的过程其实不需要这么做,我可以直接怎怎么做呢?ADD,这里边不需要定义这个名,直接把它放在这儿是不是就完了呀?哎,直接把上面这个匿名函数直接填在这个参数位置完事了啊,那后边这个minus其实也是一样啊,直接填在这里就可以了,那当然了,填在这里的形式已经比较简化了,大家看没有这个后边的划括号对吧,已经写在一行。
07:12
啊,但是呢,这个还不够简化,首先我们知道对应的这个类型其实没必要写,因为前面这里边function里边,我们不是已经把它的这个行参都已经定义死了吗?类型肯定是两个T的参数返回一个int类型,那所以这里边A和B没有必要写了啊,所以我们可以直接在下边写吧。面起见,我们就只改这个相加的代码啊。A和B的这个类型直接都可以删掉,然后接下来大家发现了,因为当前有两个参数,那前面的小括号不能删,那后边大家会发现就是当前这个A和B,好像在我们这个表达式里边只出现一次,那当前这个A和B是不是也是就是给什么名称,没必要我们可以用一个通配符来表示呢?哎,确实是可以的,之前我们只出现一个参数的时候。
08:09
在这里我们是可以直接把它用一个下划线来做一个代替,那现在出现两个参数呢,也可以用下划线来代替啊,只不过就是要求必须这个每一个参数都只能出现一次,后边我们就按照顺序来给它做一个下划线做一个替代就可以了啊,所以大家看就是直接写成什么呢。那就是A和B直接去掉了,后边就变成了A,用下划线代替,用下划线代替直接这么写也是正确的啊,所以这个就比较神奇,我们看这里边传进来的好像就是一个加对吧?就就直接就是把一个加号传进来了,所以当然我们要做的这个二元计算就是把一和二加起来了,哎,这个一看就看得非常的明确啊啊那呃,有同学可能就想到了,那如果要是做这个减法的话,那又应该怎么办呢?减法当然就是直接传一个减了啊那有同学可能想,那之前我们这是前面是减数,后面是被减数,所以刚好就是A减B,那万一之前我要定义的是B减A,这个顺序跟我们传进来的参数顺序不一样,那又应该怎么实现呢?
09:17
哎,所以大家会发现就是如果说啊,前面的这一个A和B的关系变成了这里边本来是A减B的话,可以小于下划线减下划线,那如果要是B减A呢。那就不能直接用下划线,下划线了,就必须还得是A在前面,B在后边的形式才能够替换,哎,那所以大家其实也能想到啊,B减A不就相当于负A加B吗?所以这种形式其实是可以替换成。我们把这个写出来,可以直接替换成负的下划线加上下划线,哎,这种格式是没有问题的啊,所以就是B减A的一个等号的话,我们可以直接把这几个直接打印,大家看一看,得到结果分别是什么?
10:14
最前面的是三负一,这是我们最初ADD minus得到的结果。那后边的这两个。匿名函数直接带进来三负一,这个没有问题,然后接下来呢,哎,大家看我们有两个都是加的这种实现,所以是两个三,一个负一,这个没有问题,那最后这两个呢,都是B减A,所以得到的都是二减一是一,哎,这就是我们最后得到的结论,通过这个事例,希望大家能够把匿名函数的用法以及它底层的一些机制能够更加深刻的理解清楚啊,当然了,呃,有同学可能会想到这个东西是不是太复杂了呢,其实。其实不是那么复杂啊,因为大家想一下,如果我们不用SC里边匿名函数的这种表示,如果在Java或者在C里边,你想要实现这样的功能的话,那得怎么样实现呢?你能够直接确定当前这个函数要操作的数值,然后把对应的操作传进来吗?这个好像很难,而在scla里边利用这样的一种定义,就可以很简单的实现这样的一个功能,所以它其实是非常强大的。
我来说两句