00:00
我们已经对SC中的高阶函数有了基本的了解,那接下来我们还是要举一些例子来看一看高阶函数在实际应用当中到底能起到什么样的作用。其实前面我们在介绍拉姆达表达式的时候,已经给大家举了一些具体的例子,比如说这个二元运算函数,我们会看到在这里我们是定义好了对应的数据一和二,当然后面我们也已经提到啊,这个一和二也可以不定义死也可以传进来啊,所以我们其实重点是要干什么呢?是要传一个函数,定义好要对数据做什么操作。所以这样的一个二元运算函数其实是对于我们的加减乘除这些具体计算的一个抽象。我们把它完全抽象出来,具体的运算方法可以作为函数再单独传进去,每一次调用的时候,你想要用什么样的具体操作,什么样的方法,那就传什么函数进去就可以了。所以这是高阶函数或者拉姆达表达式,我们在作为参数传递的时候最为重要的一个一个作用。那大家可能会想到,对于这个二元运算好像也没必要做这样的抽象,那一般我们在实际应用当中是哪些地方应用会更多呢?
01:19
更多的地方其实就是对于集合数据的处理上,因为大家会想到啊,我们往往在处理一堆数据的时候。比方说我们大数据处理的时候,很多的数都来了,那么所有的这些数据,我们可以把它看成一个集合,这些集合里边的元素,其实想要做的这个操作,有可能每一步都是不一样的,哎,我们整个大数据处理有可能要定义好多步操作,但这个数据呢?哎,那就是这些数据做完一步做下一步,做完一步做下一步,按照顺序一步一步走就可以了。所以这个时候我们并不关心这个数据到底变成了什么样,我们更关心的是要抽象出来,我们可以单独定义它的操作,到底要对这个数据干什么事。
02:06
哎,所以对于集合应用而言,把这个要做的操作抽象出来,这就非常的重要了,那用什么方式能实现呢?诶,如果要是在之前啊,像CC加加这样的语言里边,其实也能实现这个功能,但是可能要用到所谓的函数指针啊,那个东西用起来的话就会更加的复杂,所以现在在scla里面我们有了LA的表达式,有了这样一些高阶函数的用法。这样的操作就会抽象,就会变得更加的容易,更加好理解了啊。接下来我们还是举一个具体的例子,所以新建一个skyla的object,现在是TEST07,我们接下来主要是针对集合action和一个操作operation。把没方法写出来啊,那接下来我们其实主要的目的就是要提供一个函数,我们可以对,比方说我们的集合类型就是一个数组吧,我们要对数组。
03:15
进行处理,哎,那么我们这里边就是要当操作抽象出来,所以我们可以定义一个函数里边传参数的时候呢,传递一个操作进去,就是当前对数组要干什么事儿,呃,我不定义死,我是作为一个函数传进来的,呃,比方说我对于这个数组里面的数,所有的数都要翻倍乘以二啊,那那就是我用到的时候,我再传一个乘以二的函数进来,那如果说我要做的操作是所有数都加一,那我就再传一个所有数都加一的一个函数进来啊,这样的话,我就可以对这个数组直接进行转换了啊,所以当前我们其实就是这样啊,操作出来,然后。不理完毕之后的结果。
04:03
返回一个新的数组,所以其实就是注组只用不同的操作,然后进行转换的一个过程啊,不停的得到新的数组的一个过程啊,所以接下来我们就在那里边把它做一个实现啊,同时我们把这个就叫做re。Op对吧?啊,Arra op,然后接下来或者我们就叫这个ara operation啊,先把它定义出来,那这里边我们重要的这个参数主要有哪些呢?哎,那首先我应该得有一个arra,这里边简单的给大家提一句啊,Scda里边的集合类型我们可以直接这样去给大家看,就是RA本身就是一个类,对吧?是要注意它是有算型的,我们当前比方说数组里边存放的都是int类型的整数,所以就是int。啊,把它定义好,然后另外就是数据啊,数据我们也没有定死,就是随参数传进来的,另外还有就是操作了,我们要定义一个op,那这个op呢,大家要注意不是针对整个数组去做操作,我只要定义针对一个数据去做操作就可以了啊,因为我只要比方说我们所有数都要乘二啊,那我应该就是直接定义一个乘二操作就够了,接下来呢,我们在代码里边这个a operation里边定义怎么样把这个每一个数组里边的元素拿出来去做一个。
05:33
去做,比方说用这个op啊,做一个乘二操作,或者加一操作,然后再返回一个新的数组啊,那所以这里面的op其实针对每个元素的,那自然就是int输入,然后输出的话,我说我们还是int吧,类型不变啊,还是int,那最终得到的应该是一个新的数组,所以是瑞定是我们定义好的这个函数,那里边具体的操作。
06:01
大家其实想到了当前要针对每一个元素都应用这个op操作,然后再得到返回一个啊瑞一个数组,那所以这里边我们是不是首先得遍历这个数组里边的所有元素啊,然后要得到一个新的数组,大家是不是联想起了for循环的返回值啊,我们可以生成一个新的数组,所以这里边非常简单,直接用一个for循环每一个元素element也这个for推导式啊,从当前的array数组里边,依据元素N力集合,接下来是不是就要来一个I的呀?啊YLD生成一个新的数组里边我们要生成新数组的时候是应用当前的啊RA里边的每一个元素element,它作为参数还给当前的op得到的返回的这个值带到我们新的数组里边啊,大家知道整个这个表达式。
07:01
是得到的就是一个新的数组,那我们把它作为当前函数的返回值返回就可以了,哎,所以整体来讲这个操作非常的简单啊,那前面我们可以直接把这个数组定义出来啊,比方说我们定义一个AR2ARA的类型,当然就是int,我们直接把它声明出来吧,呃,直接用这个半成对象做一个定义啊,随便给几个数,45 75 98有四个数样的一个数组,接下来我们统一做这样的一个操作,那当然了,要调用这个方法的话,这个函数的话,那后面还应该得给一个op,那我们现在这个操作定义呢?那接下来我们首先定义一个。加一操作,也就是所有数组元素通过这个操作之后,全部都要加一,那就叫做at one,这是一个函数函数的,哎,当然就是每一个元素了,Element啊,一个int类型,返回的呢,当然也是一个int了。
08:12
要符合当前我们这个op的定义嘛,所以接下来里边返回的就是element加一,有了这个定义之后,哎,那接下来我们就可以直接调用数了。调用函数,我们可以得到一个新的数组ARAUA瑞,它的类型当然还是int。这边我们其实就是直接调用a operation里边传入的是AR以及后边的one,直接把这两个传进来就可以了,当然这里面大家看到你如果要直接ADD one后面括号去调用的话,这个肯定不对,因为你得传一个参数嘛,我们这里面要的是什么呢?
09:03
我们要的并不是它的一次调用,而是要直接传递这个函数进来,哎,所以这里边我应该是空格,然后加下划线对吧?当然这里边不加下划线也行,因为传到这个a operation函数参数里面来的话,它的参数行参类型已经定义死了,我知道这里肯定就是一个函数,这就没有问题了啊,所以得到的这个结果,我们最后可以做一个打印输出,哎,那对于这一个啊瑞啊这个数组如果要做打印输出,输出怎么样去打印呢?可以调用它的一个。啊,Princeline如果要打印输出的话,直接打印是不行的,因为它是一个引用类型,我们可以调一个mix string方法。然后里边呢,含一个分隔符,就是把当前数组里边的每一个元素按照逗号分割开,最后把它打印输出就可以得到结果了。好,那接下来我们来看一下运行的结果到底是什么样的。
10:00
再看就是这样。就是把之前的每一个元素都加了一,然后打印输出了,诶所以当前大家如果总结一下的话,这样的一个方法啊,Re operation,这其实相当于是什么呢?这就是定义了,对于数组每一个元素想要去做的那个操作,那这个操作呢,是抽象的,我们可以单独的定义,你想加一就加一,想加二就加二,对吧,想翻倍就翻倍,这个都可以额外的去做定义,所以这在我们集合类型的处理上,这就是所谓的。Map运算啊,大家可能也知道啊,大数据处理里边,这其实就是非常基本的操作map啊,就是做一个这个数据的一个转换,那或者呢,我们利用类似的思路也可以实现,比方说数据的过滤,Filter也可以实现,或者像处理的过程当中,大数据处理的啊,常见的还有一个操作是reduce做规约聚合啊,那这个也是比较常见的一个操作,都可以用类似的思路去实现,所以大家可以看到。
11:06
Scla里边的高阶函数啊,这种高级用法是非常有用的,而且跟大数据的处理天然就相关啊,那当然了,前面我们这个函数调用的时候呢,也不需要非得把这个操作啊,这个函数单独定义出来,我们直接如果定义一个匿名函数其实也是可以的,比方说我们环入命名函数直线。数组当中的元素啊,N倍,每个元素都要乘以二,那应该怎么做呢?那这个也非常的简单啊,直接调的时候我们就ara operation啊,当然我们如果要想得到最后的结果的话啊,那这里边还是定义一个u arra2,这里我们就不用再去写它的类型了,可以自动推断出来啊。re operation是把array放进去,那后边的这个操作怎么写呢?这个其实非常的简单,我们直接写这个element。
12:09
然后每一个element都乘以二不就完了吗?啊,当然这个也可以进一步简写,可以省略,它用下划线代替,直接乘以二,就表示里边所有的元素要翻倍,好,那当然我们这里边也可以它直接得到结果,打印出来,New array are make string,用号做一个分割。我们看一下得到的结果是什么?看,这就是所有元素翻倍之后的结果啊,当然这里边我们打印输出的时候,我多加了一个空格啊,所以跟前面的这个格式稍微有点不同啊,大家可以看到这就是实现了大数据处理当中的map操作啊,集合处理当中的map操作。
我来说两句