00:00
我们已经了解了skyla中集合的一些常用基本的操作。那接下来呢,我们就来。了解一下怎么样使用集合中的数据去计算得到一些结果,我们知道对于大数据处理而言,最关心的其实就是要用数据得到一些统计量的值,计算出的结果才是我们真正想要的东西啊。那对于盖拉而言,集合的类型其实定义了很多计算的函数,所以我们可以直接通过非常简单的一个方法调用一个函数,调用就可以得到我们想要的一些计算结果,比如说可以直接求和,哎,所有元素加起来得到一个结果,可以求乘积,所有元素乘起来,还有求最大值,最小值,还可以把整个。当前的集合做一个排序输出,那接下来我们就在代码里边做一个具体的测试。还是在包下边新建一个SC的object,是S13,我们要测试的是简单的一些函数simple function,把我们要测试的点都放在这里。
01:16
然后接下来我们还是以最常见的集合类型list为例,给大家做一个讲解啊,那其实大家也能想到啊,如果后面我们还要想要做这个排序的话,那肯定是要基于list啊,有序的这个集合类型才是有效的,如果要本身无序的话,那这个排序就没有意义了嘛啊那所以接下来我们还是定义一个list,做一个处理,用完生对象,把原始的这个数据啊,直接就赋值附进去,比方说我们给几个数518。二啊,还可以给负的啊,负三四直接放在这儿,接下来求和操作的话非常的简单,如果我们自己实现的话,其实也不难,那就是写一个放循环吧,我们这里边可以循环,然后推导式啊,每一个element从这个list里边取出来,里边呢,我们自然就想到了,外边应该要去单独的定义一个变量Y,我们把它叫做大。
02:27
不是值,那就是零了,里边每来一个元素,那么some就它等于element,那最后得到的sum就是我们想要的这个。所有数的这个和啊,这个是非常容易啊,我们能想到的这样一个计算的过程,我们先来输出一下啊,得到的是17啊,这个肯定是没问题的啊,二加八这个是十嘛,514刚好又是十啊,20减37没有问题,但是这个过程尽管简单,但是就是写在代码里边的话,如果这些。
03:02
简单的一些操作我们都得写出放循环来的话,还是显得有点有点繁琐了,我们在实现一些复杂系统功能的时候,肯定是希望简单的操作都给我包装好,我直接一调,呃,调用直接把它处理完了就完了,哎,那当前这个我能不能包装起来呢?在skyla的集合类型里边给我们都已经包装起来了,所以我们直接做一个非常简单的方法调用,比如说list啊,是这个sum,直接调一个sum方法可以帮我们直接打。直接获取到所有元素相加之后的结果啊,所以大家看这就非常的方便了啊,可以让我们写代码的时候把。注意力,把精力都重点放在更复杂的那些业务逻辑上,这些简单操作直接全部搞定啊,对应的还有这个求成机,就是list,可以直接调product方法。可得到所有元素相乘的结果。
04:02
那另外还有这个求最大值和最小值,那就是最大值list接点max得到这样一个值,那最小值的话啊,例四点幂直接可以得到这个值,整体来讲还是非常的简单的,我们现在运行一下看看输出的结果啊,我们看乘积,因为有一个负数嘛,而且有二有五啊,是一个整整十,所以是负960,最大值八,最小值负三,完全没有问题。这是我们基本的这些方法的一个测试啊,其实我们知道这些方法是都可以用一个for循环就直接搞定的。关于这个最大最小值,这里还要多说一句,刚才大家可能会发现啊,我们在套用这个方法的时候,还涉及到了一个,下面还有一个方法叫做max,又是什么意思呢?简单的我们点进去会会看到max y这里会有一个参数。这个参数呢,是一个函数。
05:01
这个函数表示什么意思呢?哎,其实这种max by,它主要是用来表示,假如说我们当前的这个数据不是这么简单,就是每一个元素刚好就是一个可比较的数据,如果不是这么简单的时候,那我们这里边可以去指定。我要怎么样找到我要去判断的这个元素,哎,这是啥意思呢?就比方说我们再举另外一个例子吧,这二这个例子列出来,比方说呃,我们这个就是现在啊,把它定义成一个元组类型,这就复杂多了啊,比方说像现在我们这个A。那这个第一个元素是A,然后第二个元素是五,我们上面的这个数量是一样的啊,这个T类型的值是一样的,然后比方说B后边是1Z2282。
06:10
同样后面我们定义出来,E是负三,F是四,哎,那这样现在如果我们要想直接把当前的这个LIST2做一个排序的话,它会得到什么样的东西呢?我们首先LIST2直接调一个max,先试一下输出一下。看看效果怎么样啊?大家会发现当前的这个max它输出的其实是,诶这里大家看到是这个就是F4,所以为什么它会输出F4呢?这个四并不是最大的值啊。它是因为当前我们判断它最大的时候,如果是一个元组类型的话,它就只判断第一个数,那第一个值,那么第一个值又按什么来判断呢?现在是一个string类型,那我就按照它的第一个字母的字母序的大小,阿斯码的大小去做一个判断啊,所以那你自然就是F比前比后面这些都大嘛,啊那。
07:14
我们想要的并不是判断它当前这个字母,这个字符串的大小,我们想要的是后面这个数,那又应该怎么排呢?这就必须要给一个函数指定当前的这个元组,怎么样提取出对应要做判断的那个值,哎,那这里边我们怎么样去提取出来呢?那就用max by里边传一个函数放在这。的函数,我们自然想到了啊,前面是参数,后边是这个拉姆达表达式这样的一个写法,我们当年的参数其实是一个。一个二元二元组对吧,大家看到这里边是一个元组类型嘛,我就把它叫做temp这个类型如果写出来的话,String in,那后面我们要做一个什么操作呢?其实就是把它的第二个元素下划线二拿出来不可以了吗?就是我们想要指定的排序的那个元素,哎,所以这样的话我们再来运行一下,大家看一下。
08:20
这就没有问题了,当前取出来的是C8,这是后边这个值最大的那个元素,哎,所以这个可以看的非常的明显啊,那这里边其实还有。进一步的简化的空间,因为对于这个拉姆的表达式,我们说了能省则省嘛,我把它完整的copy下来,首先目前的这个类型。既然是列表LIST2里边的元素,它的这个类型都已经定死了,肯定就是这样的二元组,那这个参数类型不用写,然后当前这个参数只有一个小括号也可以不用写。另外我们发现了temp在后面只出现一次,那是不是直接可以完全把这个参数省略掉啊,直接用一个通配符大划线做一个一代,所以最后我们得到的就是下划线,点下划线二,这表示什么呢?就是当前的数据是元组类型,我要使用它的第二个元素作为排序的准则啊,那刚才你看这个就是max by by第二个元素嘛。
09:24
这就是非常明确的一个指定,那同样后面这个最小值呢,M也有一个M,如果说这里边我们指定了下划线二_二的话。我们可以看到这个list没有下划线二对吧,因为它里边并不是元组的数据类型,所以我们是用例二啊一个这样的操作我们可以看到得到结果当然就是一负三,就是第二个元素最小的对应的那个值。啊,这就是关于最大最小值的一个扩展,那这里边大家其实已经发现涉及到了一个。
10:03
按照哪个值排顺序取最大最小值的这个过程,那假如说我们想要得到的并不是只是单一的最大或者最小的那个数或者那个元素啊,我们想要是把所有元素都按照大小关系完整的排列出来,得到一个新的列表,那又应该怎么做呢?那就是要调排序的方法得到对应的结果了。排序的方法,前面我们做的这些操作呢,得到的都是,比方说这个求和或者求乘积,这是一个具体的数,最大最小值,这是一个具体的元素,而排序呢,返回的应该是一个集合类型,列表的话,返回还是一个列表啊,那接下来我们看一下怎么样去排,最简单的方法就是用一个方法叫做sorted,比方说这里边我们直接。List直接调saled,那其实就对它做了一个排序,那大家也知道list本身定义的时候,我们是一个不可变的列表,那自然不能改变他自己了,所以我们要把它赋给另外的一个变量,我说我们叫做sorted list,那这个时候line sorted例子我们看一看得到结果是什么,前面可以做一个分割线。
11:24
运行一下。我们看这就是排序之后的结果,List负31245,把从小到大完整的排列出来,哎,这个过程其实还是整体来看还是比较简单的啊,直接调用就可以了,那有的同学发现了这个默认是从小到大排列啊,那如果说我想要从大到小排列又怎么办呢?想要从大到小逆序排列,那自然有同学想到,你既然是要逆序嘛,前面我这个默认排出来是从小到大,那我就干脆doted之后做一个reverse不就搞定了吗?哎,当然这种方式是没有问题的啊,先把它排出来,然后再翻转,但是从效率上来讲,相当于我们做了两个步骤,诶,这个效率其实有点不高,所以比较推荐的是另外一种方法,一种方法叫做传入。
12:21
一个影制参数,这是什么意思呢?我们看一眼这个sted的源码啊,看到它其实是里边有一个参数的,参数比较特殊,前面用了一个修饰,叫implicit。这是一个影视的意思,所以它是一个影视参数,什么叫影视参数?那就是它可有可无,你可以不传,如果不传的话,那就要编译器在别的地方找对应的影视变量的定义,如果有对应的定义的话,直接拿过来填到这儿,哎就可以就可以直接用了,那当然了,当前这个参数叫做大家看到它的类型是一个ordering类型,Ordering当然就是要定义排序的顺序了,到底是从小到大还是从大到小呢?默认情况下它用的就是从小到大,所以如果我们不传,默认这个参数就是从小到大,我们现在要想让从大到小,那自然就是简式的把这个参数传境去就完了吗?所所以我们要传的其实是一个ordery各类的一个具体的实例,我们看到它有型啊,那对应的这个我们把泛型填在这儿,那这就是它对应的一个生对象了,办生对象可以直接用啊,这是。
13:36
的一个对象实例,那另外呢,默认情况下肯定它是从小到大嘛,从大到小又怎么办呢?本身也有一个reverse方法啊,这样的话就表示翻转了顺序翻转了从大到小,我们这个排序的时候,你就相当于把这个规则排进传进去,那排序的过程大家知道其实就是。不停的选元素,然后做比较,然后交换位置嘛,啊,那这个我们规则变了,那其实交换的时候一趟就直接搞定了,不需要用两个步骤去做啊,这就是。
14:08
采用传入参数,影视参数,然后salty的实现从大到小排序的这个过程,哎,那接下来大家可能就想到了,那如果说我想要对这个LIST2做一个排序,又怎么排呢?啊,这里面我们可以先看一下直接二。得到的是什么东西?啊,大家会发现这个不出一意外啊哈,我们还是按照第一个元素,它的这个是词string的话,按照它首字母的字母序ABCDEF做了一个排序,这并不是我们想要的,我们想要按照后边这个数第二个数的大小去做一个排序,那怎么办呢?根据前面的经验,我们不是有max by明BY吗?所以排序的时候我们也可以有二种方式,那就是thoughtt啊,那所以接下来我们定义的时候可以用这个LIST2还一个我们看到the saled之外还有一个sal by方法同样。
15:15
也可以传入一个函数,指定当前要去做排序的那个字段,然后同样后面还有一个参数,这个是影视的aer啊,那跟我们前面一样,默认从小到大,反过来的话,那就从大到小,所以这里边我们可以直接传入下划线,点下划线二,这就是按照第二个字段从小到大做这样的一个排序了。我们可以直接把它输出一下。哎,大家可以看到当前的排序就变成了一负三,这是最小的,最大的是C8,完整的从小到大按照第二个字段排排出来啊,那对应的我们也可以加上后边的影式参数,大家看这个影式参数,这是我们之前讲到的课比化的这种表达,两个括号直接这样分开,分步骤去传。
16:07
直接给一个reverse。那么现在不出的当然就是反过来的,C8是第一个最大的,那最小的是一负三,这是关于south south半,嗯,那另外大家可能会发现就这里边啊,如果我们从小到大默认排列的话,还比较简单,看起来这个代码非常的明明白啊,就这里边直接这么去排就完事儿了,但如果说要是从大到小的话,总要传这个影视参数,觉得这个好复杂呀,而且这里边还是这种颗里化的这种传入啊,还得记得这个ordering,它有泛型,然后再调一个reverse方法,有没有更简单的表达呢?哎,其实这里边还有另外一种更加一般化的一种用法,那就是刚才我们在调用的时候也看到了,还有最后一个叫做south with的方法,所谓的south with,但是with嘛,其实就表示的是我们要把当前的。
17:06
规则直接传进去,所以接下来我们看一下这个规则又怎么传呢,对吧,List或我们这里直接调with的话,它只有一个参数。就是一个函数函数两个参数传入,然后呢,得到的返回值是一个波ing类型啊,所以大家会联想到这不就是Java里边的competitor比较器吗?啊,我们比较器其实也是类似于这样,就是相当于我们要定义啊,就第一个数据传过来,第二个数据传过来,他们俩按照某种比较关系,最后判断完了之后,如果说我返回处就表示相当于他们俩不需要。交换顺序,那如果要是返回为false的话,那就要交换顺序了啊,所以这个其实非常的简单,就可以实现他们的一个比较排序的这样一个过程,那我们这里边如果是从小到大排列的话。
18:05
非常简单,我们应该怎么排呢?两个数嘛,一个A一个B前我们是要写这样的一个拉姆达表达式。那后边我们具体的实现括号括起来。做一个什么判断,当然就是A小于B时候,我们就当于从小到大的顺序嘛,A小于B,那不用交换,就放在这儿就行了,哎,那如果要是大于B的话,我们就要交换过来啊,那所以这就是默认直接输出的一个从小到大的排列。大家看到负三一直到八没有任何问题,那这个写法其实还是比较麻烦的啊,因为拉姆达表达是两个参数啊,非常的繁琐,根据我们之前讲的。能省则省的。转化原则,那首先当前的类型直接去掉。
19:02
适应的,这个不用说不知道,然后接下来呢,再来我们发现了当前的这个所有的参数在后边只出现一次,哎,然后最后这个划括号也可以去掉啊,只有一行代码,另外我们这个参数只出现一次,那是不是可以按照顺序全部用下划线代替啊,哎,所以接下来这两参数用下划线代替的情况,直接就写成了下划线角于下划线。一看到这个表达我们就知道了,With with什么呢?小于嘛,从小到大啊,所以大家如果用的习惯的话,South with其实对于这个表达是非常明确的啊,那同样如果我们想要从大到小做一个排列的话,那不就是直接so with下划线大于下划线吗?哎,这个得到的结果我们可以对应的直接来做一个输出,看一下,大家看到完全没有问题,前面两次是从小到大排列,最后一次从大到小排列啊,关于排序的这一部分,大家下来之后还要多做一些练习。
20:09
这样的话就可以在后边我们进行项目操作的时候,对这个排序可以熟练的应用了,这是关于简单的计算函数的集合里面的一些操作。
我来说两句