00:00
我们已经了解了离合的高级计算函数,或者叫抽象的计算函数,主要是有哪些类型,怎么样去使用,那接下来我们就在代码里边做具体的测试了。首先我们要来测的是只做集合转化,而不做规约处理这一类我们把它归统一叫做map类的一类高级计算函数。接下来我们首先创建一个新的加object s14,我们要测的还是欧级的high level,是刚前我们测的是map类,那首先我们还是先把一个集合先创建出来,我们用的还是最常见的最简单的代表类型list里边的数据我们就简单一点啊,直接给123456789。第一个我们想要测试的就是过滤操作,所以我们知道是要传入一个条件,当前符合条件的数选取出来放到新的集合里边,那比方说我们现在的条件就是。
01:09
选取偶数,得到的就应该是一个偶数的列表了,Even list里边我们就基于list去做到一个filter方法,里边filter方法要传入的是一个函数,这个函数我们看到参数A类型,这个A它是泛型嘛,当然就是当前的。我们定义好的这个list的泛型整数类型,我们当前是int,那得到的呢,是一个booing类型的返回,所以我们其实就是把当前的每一个元素作为参数传进来。根据这个规则判断一下,得到一个true false的结果,如果返回是true,那当前的元素就保留,如果是false,那就过滤掉不要了啊,这就是所谓的filter过滤操作,我们现在既然是选取偶数,当前我我们要传的这个函数嘛,那么在表达式先写出来,前边是分数,后边是函数体,那里边的这个参数前的元素类型linkt放在这儿,那后边我们其实就是要把它是否为偶数做一个判断,是否为偶数的话,其实就是对二取余,问它是否为零嘛,这样一个操作吗?哎,所以这样我们就可以得到一个偶数的列表了,打印出来看看结果是不是符合我们的预期。
02:36
没有问题,2468得到的就是偶数列表。当然了,大家如果要是对拉姆的表达式非常熟悉的话,一看这个样子,知道可以做化简,如果我们化简一下直接打印的话,应该是首先int类型省略掉,前例的类型肯定是int嘛,元素,然后前面只有一个参数,小括号省略掉,后边只有一行代码,花括号省略掉,那接下来这个参数只在后边出现了一次。
03:08
那好吧,直接用下划线代替,我们如果要是以后熟悉的话,可以直接写出这样的一个表达式,它就表示当前例子里边的每个元素,对二取于,判断是否为零作为一个条件做一个筛选。啊,那当然了,如果我们要是直接把这个成一的话,不就是选取奇数吗?哎,这我们自然都是能够直接想得到的结果,应该是13579构成的一个列表。这是关于过滤操作,是比较简单的,接下来呢,我们再来说先还是分割线打印出来下来就是更加一般化的操作,就我们所说的反化或者是映射操作,那就是正狭义上的map操作了,是啊,每一个元素并做一个转化,得到一个新的集合,相当于就是一个集合的映射关系啊,那接下来我们看一下,比方说我们现在想要把。
04:16
集合中每个数乘二,哎,那这个怎么做呢?非常的简单,就之前我们在讲解这个函数高阶应用的时候,其实已经只自己实现过类似的这个map的操作,我们这里边只要直接调用这个map就可以了,可以list直接调一个map里边我们看到他要传的很显然也是一个函数。当前的这个函数,那就是就是怎么转换嘛,当前的数据类型是A,然后转换成一个B,想怎么转换怎么转换啊,那我当前也不转换数据类型啊,只要map这里边乘二不就完了吗?啊,那我们做的操作自然就是当前的每一个element要去变成element乘二我们也知道,就直接简写是下划线乘二就是我们要做的操作。
05:14
啊,那当然他也可以想到,如果说我们想要直接把每个元素换成它的平方的话,能不能直接写下划线成下划线呢?来注意不能这么写,那我们当前没有两个参数对吧?如果要是直接写平方的话,那如果有方法的调用的话,那可以直接使用这个方法调用,如果要没有的话,那就老老实实的我们当前数据是X,就返回一个X。乘以X,那就完了。我们现在可以直接打印输出一下。那我们可以看到,上面输出的就全部都是乘以二之后的偶数,下边输出的是对应的平方数,这是关于map的转换操作,接下来我们再看一下,下一个还要考虑的操作是所谓的平化、扁平化,这个操作其实我们也不陌生,之前对于丽而言。
06:19
我们直接如果要是把两个啊,两个这个嵌套的例子的放在一起的话,其实我们可以直接把例,就是当前的这个例子的调用三个点的那个。符号,呃,就是对应的方法,直接就把它打散了,得到的全是具体里边的数据,然后最后再合并成一个例子,那现在呢,我们是直接调用这个高级的计算函数,也可以实现类似的功能,比方说这里边我们定义一个,但要扁平化,就一定有这种list的list,嵌套的list,我们定一个NAS list。类型我们专门的大家专门写出来啊,前面我们都已经省略掉这个类型了,它是一个list的list啊,那里边的list是一个int类型,所以完整定义的话,那就是里边有list,比方说123,后边还是list,有四五还有list。
07:26
678走,这就是一个嵌套的例子,里边呢,真是三个列表的一个列表,而每一个列表呢,里边又有不同个数的几个具体的这个整数的值啊,那接下来我们的问题就是能不能把这些全部打散开,就把它合并成像我们一开始例子的这样的一个123456789的列表呢?哎,当然是可以的,之前我们有一个方法,就是可以直接我们定义一个呃,Flat list屏之后的一个list啊,可以直接。
08:09
我们取出来嘛,这里面不是有有好多有三个元素吗?那我就把这个nested list,我们知道第一个元素list里边按照索引可以把它拿出来,零拿出来,那对应的这就是一个例子,然后用三个冒号这个方法,接着去处理后边的一个二个元素这个list,然后接下来再用。NEED2啊,最后的这个拿出来啊,这样的话我们就可以得到完整的啊,123456789。扁平化之后的这样一个效果,我们先来打印一下,看看是不是符合预期。看到没有问题,可以输出这个结果,但是这种方式呢,其实是不太方便,或者说扩展性比较差的一种方式,因为当前我们是只有三个list作为它的元素,那我们现在就是next斯蒂的012这样列在后面就可以了,那假如说当然这个例子的非常非常大呢。
09:15
假如说这个大道元素个数我们一开始也根本不知道呢,哎,那这个时候我们当然是希望能够有一个更加通用的方法,不要这么一个一个把它展开,也能够直接扁平化搞定打散,那这个方法就是我们这里讲到的,呃,我们这儿直接就把它叫做black list,二是基于前面的next list,直接调一个方法看,就叫做这个L。调用之后再做一个打印LIST2。可以看到跟前面的效果一样,直接把它全部展开打散输出了啊,那整体来讲这个还是比较简单的,主要是跟之前我们列表的那个操作作一个对比,我们就看得很明显,好,接下来好,我们再来看一下下一个操作,其实就是上面两种操作的一个结合,这个叫。
10:21
点评,映射,前面我们讲了map是一个映射,后边我们又讲了扁平化的一个操作,那有没有这样的需求,就是我们需要。做一个map转换,转换之后呢,有可能得到的是就是我们当前的这个列表里边的元素就变成了一个集合类型,然后接下来呢,我还希望把它再打散,能不能把这样的两步操作合在一起呢?哎,比方说这里边有一个具体的需求啊,在很多应用里边非常常见,比方说我们想要做的是将一组字符串进行分词并保存成。
11:15
恩词的列表,这是什么意思呢?我们看一下当前我们输入的这个叫做string,它的类型呢,是一个,当然就是字符串构成的一个列表street,那么对应我们的定义,把它直接写在这,它里面可能就有各种各样不同的词汇,我们看一下,哎,看,Hello word。这是当前里边的一个元素,然后还还有可能有别的东西啊,比方说我们这里边盖LA啊,那另外可能还有这个喽,好吧,可能还有啊,随便写一个we study,大家想我们这里边有很多的词,现在其实不是需要,首先是不是要把它做一个分词啊,因为这是一个字符串,里边有可能有多个单词,那现在是先要分词分开,然后接下来呢。
12:25
那每一个分子分开,其实得到的应该是一个数组或者一个列表了,然后再把他们还要做一个打散啊,那所以接下来我们做的这个操作应该是两步操作,第一步。应该得到打散之后的一个结果,对吧?哎,那所以这里边我们得到一个不对,其实先做一个是打散之后是分词之后的结果啊,先把它分开,我们叫Li,呃,List,那么这个我们要做的操作其实就是strings啊,可以直接做一个map了,Map转换每一个字符串,转换成什么呢?我们可以直接调字符串的,我们就知道了每一个string。
13:07
Map里边是一个拉姆表达式嘛,函数嘛,我们可以直接调它的split方法,按照空空格去做一个拆分,就我们知道fli得到的结果是一个是我们那个Java里边string,这个Java类里边的对应的这个方法嘛,得到的是一个string的数组,那如果包装在skyla里边的话,当然其实就是一个。是一个array string,那所以最终我们得到的应该是什么呢?每一个元素string都转换成了一个a string,那最后其实就是一个a string的list了,那就变成了这样一个东西。就是我们类似于前面讲的嵌套的列表了啊,就是以集合类型作为元素的列表啊,那当前的这个转化我们也可以简写啊,这只是让大家看的清楚,习惯之后我们就直接二划线,把split表示要把元素做一个按照空格拆分分割的这样一个操作。
14:15
首先这里边其实就是分词,然后接下来基于分开的这些元素,当然就是要做一个平化处理了,所以我们其实得到的是一个flat list,那就是基于read list,直接做一个flat操作就是。阿伞。很平化,这我们可以直接printline当前的Fla list做一个输出。看效果是不是我们想要的,诶,大家看到没有问题,这就是把所有的单词都拆开,哎,然后得到了我们想要的这个一个string类型的list。
15:03
那这个确实思路是清晰的,但是这个过程稍微有点麻烦,因为我们也发现了这个flatten,他也就是直接打散扁平化的一个过程啊,好像不需要我们传入什么操作,没有什么抽象级别的东西,诶,所以干脆就把它这个就合并了,有一个特殊的。函数无法调用,那就是直接叫做扁平映射,这一个操作包含了我们这里的先map在flatten的两步操作,这个操作叫做flat map啊,那所以这里面我们可以定义一个flat map list做的操作呢,就是基于前面的strings,最初的这个啊,直接调一个叫做flat map的方法,然后里边呢,传入的就是我们要做的那个map转换操作split格。所以他做的操作其实就是低于这一个传进来的函数,先做一个转换,得到的呢,一定是一个嵌套的集合类型,那接下来我就直接把它打散,不用做别的考虑啊,直接打散就完了,所以我们啊应输出一下这个结果,你看是否跟前面的Fla list完全一样。
16:18
我们看到没有问题啊,所以这就是一个简化版的实现。然后最后呢,关于集合转换的这个过程,我们最后再来介绍一个比较特殊的。他得到的已经不再是list,前面我们这个转换之后还都是list,那最后这个呢,到的是一个。Map这个做要做的操作是一个分组操作B,它是一个goodbye这样的一个操作,这组其实大家也并不陌生,如果有同学之前呃对于这个CQ比较熟悉的话啊,那其实group by操作我们都知道,经常就可以调用,然后把我们当前的数据进行分组处理,那在skyla里边直接集合类型支持的分组操作到底怎么用呢?这里边我们可以呃,比方说啊,像之前我们这个list不是有。
17:11
奇数和偶数吗?那我们干脆直接分成两个组吧,直接把它分成分成。Do。两组,那我们当前要做的操作啊,我们把它叫做map,因为得到的必须要有key value嘛,这其实是一个map了,我们就直接基于list到一个操作,看一下group by里边传什么。又是一个函数,函数要干啥呢?AA是当前的数据,数据是什么?当前是这个int类型的,那接下来返回的是什么呢?返回的是一个K类型,这个K其实就是最后我们不是得到的是一个map嘛,Map就是需要有一个有一个组名作为当前的K,然后这个组里边的所有元素构成的集合作为value,那这个组名到底是什么呢?这不就是我们当前选取的那个规则嘛,对吧?我定义一个什么样的规则,得到一个专门的组名,所有的属于同一个组名的元素都放到这一组里来。
18:24
当前我们的定义定偶数是不是就是看对于。二取余的结果就是当前的组名啊啊,就是那对二取余的结果,一个是零,一个是一,如果是零的话,偶数,如果是一的话,那就是奇数,哎,当然大家也可以,呃,我们这里简单写的话就是二划线,然后2%这个就直接搞定了,对吧?就是最简单的一种书写的方式,那如果大家希望这个解的稍微复杂一点的话也可以,我们group by里边本身应该有一个前的data。
19:05
里边我们要传入的是一个拉姆达表达式,那这个拉姆达表达式呢,就是后面我们要给具体的这个实现的过程,首先我们可以先来判断一下当前的。看第二取余的结果到底是不是零,大家可能会想到,如果是零的话,那是奇数,那是偶数,我干脆就直接返回一个字符串偶数,要死的话,那就返回一个字符串奇数。哎,这样的话其实也是可以的,我们当前的组名就更加的明确了啊,这里边大家会发现就是。我们可以直接还是放在这个一行里边啊,这样看的非常的明显,那当前它返回的类型到底应该是什么呢?我们让它自动做一个一个判断吧,看一眼我们看到它是一个map,目前map的。
20:05
K不是int类型,就是当前我们定义好的啊,返回的这一个组名就是当前的K,那value是什么呢?Value就是属于这一组的所有元素构成的list,所以整体来看的话还是非常的明确,我们可以在这把这个类型写出来,那下面这个类型我们能写对吗?可以试一下。但这个类似是可以返回的类型就应该是int,而应该是一个string类型了。我们的组名也是一个string类型,这就是string。接下来我们可以做一个打印输出,你看这里的group map和group map2到底长什么样子。运行一下。我们可以看到当前就划分了两个组啊,一个组,你看之前我们这个group map里边组名就是一和零,一里边是123、13579构成的list,零里边零组里边2468构成list,而下面我们这种写法呢,就一个叫做奇数组,一个叫做偶数组,它们的value都是一样的,就是所有对应元素构成的list。
21:20
啊,这里面我们还可以再举另外的一个例子啊,前面我们这是分成六两组,我们还可以比方说。A1组。词汇一组word对吧,然后我们要按照。按照单词的首字母。进行分组,所以这个其实也是比较常见的一个需求啊,就相当于我们做一个字字典序的一个归类,比方说现在我们定义一个word list,非常简单句类型的啊,呃,我们就还是写英文吧,英文比较简单吧,里边比方说China啊,可能有国名,可能有人名啊,可能有America。
22:15
嗯,那我们这里边给一个ice还可以有,呃,Canada可以有carry,可以有op啊,这些都是完全是可以有的,对吧?啊,可以有这个Japan一些单词,我们根据首字母要做一个分组,那怎么样直接把这个分组出来呢?Line非常简单,World list直接。当前的首字母首字母那就是下划线,有一个叉AT0不就可以了吗?AT0是当前每一个单词的首字母,这个下划线表示的是我们拉姆达表达式里边参数对吧?呃,参数对应的。
23:08
每一个元素点下划线,呃,点叉at,取它的首字母得,得出来的就是我们当前的组名,所以我们当前的这些数据有几个组呢?啊,我们会看到应该有一个A组,有一个C组,有一个B组,还有一个J组,具体我们可以输出看一下得到的结果。诶,大家看到就是这样,B组只有一个Bob,这组是Japan a组America Alice c组China Canada carry啊这就是我们对于呃,Map类的啊,转换操作集合转换操作的一些高级用法。
我来说两句