00:00
我们已经了解了scla当中不可变的map集合到底怎么样去使用,这里边呢?呃,我们还可以给大家介绍一个比较简单的访问某一个K的value的方法,前面我们看到啊,这里边推荐的写法其实是map1.getelse啊,就是你处理一下它最终得到的结果,如果要是为囊的话,那最好是直接付付给他一个初值,这样的话就解决了,也不会抛异常,也不会直接得到,比方说像这个萨啊nu这样奇奇怪怪的一些包装类型,这是比较推荐大家使用的,那有的同学可能说我就是直接想简简单单的直接获取对应的这个K的值,如果要真的没有它的值的话,我就直接抛异常,我干脆就用异常处理了,那那怎么样能做到呢?用我们上面的这种方法就可以做到,对吧,就是先get对应的K的值,得到的是一个option类型,然后再调点get方法,那如果要是它是sum的话,得到就是最终的值。
01:00
如果要是那的话,抛一场,但是这个写法有点太麻烦了,有没有简单的方式呢?有的啊,这边简单的方式就是直接一里边把对应的这个K盘进去就可以了。那有点像之前我们直接访问这一个,呃,数组,数组里边元素的那种写法啊,那所以这里边我们是把K而不是索引啊,其实大家知道基这个map底层啊,比如像这个哈希map,我们底层访问的时候,当前的P其实就是。对应着我们存放的地址,我们是基于它的哈希code去做了一个地址的寻址的,啊,那这里边当然就是我们可以认为啊,是传入一个寻址的索引,然后得到了对应的值。一层调用的话,我们会发现是一个apply方法,里边out的就是方法,后边呢,做了一个match case,这是一个模式匹配,后面判做的就是我们刚才说的那个事儿啊,就是判断当前如果为nu的话,这里是掉了一个default方法,那如果是sum的话,直接返回它的值,Default方法又干了件什么事呢?呃,直接抛出异常啊,这就是我们呃,比较简单的一种写法,如果大家觉得这种更好用,可以采取这种方式,那当然了,对于一个不可变集合,它本身是不能调用put方法的,我们发现前面我们并不能往里边去新增一个元素,因为它是不可变的,不能再去加新的元素了,那如果我们想要增加元素,那怎么办呢?
02:36
那就只能采用可变的map集合。接下来我们就讲讲可变的map。还是新建一个测试的object的零九,现在是multiple map,没方法。首先,我们还是先来创建一个map。
03:00
创建map的操作,那整体来讲跟上面我们用到的不可变map类型的创建其实是差不多的,要做区分的就是里边默认是不可变,那现在可变怎么办呢?跟set的处理一样,包嘛,名称都一样,都是map,不同的包下边表示到底是可变还是不可变,那就是multipleable.map。当然了,前边的类型我们也要把它做一个包引入啊,接下来我们运行一下,可以看到得到的当前的这个结果还是完全一样的,显示输出完全一样,但是它的类型呢,跟之前就有所不同了,之前是。Map下边的MAP3我们发现哦,你传入三个元素,那对应的就是MAP3,那就相当于是只有三个元素的这个值嘛,那如果说这里边我们是传入四个元素,当然就应该是MAP4了啊,那现在呢,我们这里边其实就没有map几,不限定它的元素个数,直接就是一个哈希map,哈希map当然就是map这个特征的一个具体实现了啊,所以创建map的过程跟前面是非常类似,既然已经创建出来,接下来现在我们终于可以往里边添加元素了,做一个添加元素的操作调用啊,那就直接调用put的方法,现在终于有了非常经典的操作,还一个B,翻一个VALUE2个参数就可以了,方说我们给一个C5,然后我们再给一个B,有这个完全是可以做得到的,现在我们再来print line那一的话都会看到。
04:45
目前这个哈希map里边多了C和D对应的剑齿,对,当然这个顺序,呃,我们这个哈希map里边是无序的嘛,啊,这个顺序是不需要去考虑的啊,那除了这种添加元素的方法之外呢,我们再给大家介绍另外一种用符号去做添加元素的方法,那这种方法呢,是我们可以在源码跟踪源码的时候发现用这个po的方法我们点进去。
05:11
大家会发现啊,底层其实是调用了一个。Update方法啊,当然它还有返回值啊,返回了当前我们传进来这个value包装成了一个option类型,那当年这个它底层调的是一个update update底层又是什么呢?是一个加等于符号方法,那我们看scla的源码里边,很多地方底层其实都是用这个符号方法实现的,这里边呢,本身是方法调用,我们写成了空格的这种形式,前边当然就是调用它的对象了,This,当前的map对象,那么接下来加等于要往里面添加一个元素,添加的元素当然就是后边的参数了,参数是什么呢?是个双重括号,然后k value,这表示什么意思呢?大家要注意一下里边的这个小括号K逗号value,它表示的是一个键值对,就像我们前边在这个for each里边表示当前建值对的数据类型的时候,传了一个string in,用小括号括在一起,逗号分割一样,现在就是直接用这个小括号括起来表示这是一个键值对。
06:24
哎,那我们不是说你只有这一个参数的话,可以可以这个直接把它放在后边,然后不加那个外面的小括号吗?那为什么现现在外面又要加一重呢?那就是因为如果你不加外边的这一重小括号。那编译器就会把我们的这一个。TY6对理解成是当前方法调用的两个参数,因为大家想到如果只有一个参数的话,小括号可以省略,那两个参数怎么办呢?那不就是小括号括起来,然后逗号分割吗?这个编译器就搞不明白了,所以为了让编译器不做,不出现混淆的情况,那我们在外面再单独加一层小括号,外边的小括号表示这是一个方法调用的参数,那么参数到底是什么呢?是里边的小括号括起来的一个。
07:13
KY6,对啊,这就是这种调用方式,那有了这个底层的源码支持,我们就想到了当前我如果要添加元素,是不是也可以直接MAP1加等于,然后两个小括号括起来一个添加呀,啊K对,也可以这样去做,比方说我来一个一七也是可以的。啊,所以两种方法不看我们哪种方法使用起来更加的明明确安E整体来讲我觉得put方法应该更加经典,大家也更容易接受啊,所以这样我们就得到了当前添加进来所有元素的这样一个结果,换一行。去看接下来的操作,前面我们做了添加元素,有添加就有删除,增增就能减B,下一个我们来看删除元素的操作,删除元素的操作其实非常的简单。
08:14
甚至我可以直接把上面的copy下来。我们来看一眼,呃,里边添加元素的时候是直接put删除元素呢,哎,当然就是反过来remove嘛,Remove的时候我们并不需要指定键值对,而是直接指定key就可以了啊,因为我们知道查询里边的某一个元素,自然就是直接用当前的key做一个查询吧,哎,这里边涉及到就是查询操作的话,是跟之前我们那个可变集合可变map里边操作是一样的啊,就是这里边MAP1直接点get可以得到对应的一个option类型的值,那然后你再可以得到具体的值了,当然如果本来没有这个K的话,那就会抛出异常啊,那更简单的操作,我们可以直接这样去获取当前它的值。
09:07
我们可以把它直接打印出来,然后之后,哎,这里我们如果要直接做一个删除,诶,那当然就可以这样的一个操作了。然后在后边如果我们要直接去打印的话,大家知道就得抛异常了,对吧?哎,所以这里边我们可以直接else给一个零,然后接下来我们。呃,剩下这个就不用再去做其他的操作了啊呃,那对应的我们还可以,上面不是有加等于吗?那接下来自然就应该有减等于了,比MAP1还可以做一个点等于操作,那后边前我们是传两个括号,主要是要表示一个传一个参数,这个参数是一个键值,对,那现在你要删除的话,是不是只给一个K就可以了,哎,所以接下来我们就干脆只给一个字符串。
10:08
卢克就把当前这个就删除掉了啊,那所以接下来我们可以运行一下,看看得到的效果是什么样的。不出意料,本来这里边C的值我们一开始是五,然后接下来呢,删除掉C,那再输出就变成了零了,因为找不到了嘛,那最后我们在删除掉D之后得到的这里边就只有Abe还有hello了啊,这个其实看的可以非常的明显啊。下一步我们继续看这前面我们已经在添加元素的时候发现啊,Boot的底层要用的其实是一个update操作啊,当然update底层是一个加等于啊,那这里边既然是update,它其实表示的是一个更新修改的操作,所以呢,我们除了添加和删除元素,还可以修改元素,这个修改元素分成两种情况了,如果里边当前的这个K存在的话,那我们其实就相当于是一个修改,只要把value更新就可以了,那如果要是不存在的话,那相当于就是一个插入嘛,所以插入和修改的操作在这里边是完全等效的啊,我们这里边也可以直接把上面的这个内容copy过来。
11:27
当前就不是不了,而应该是update啊,那我们本来已经把C删掉了,如果再update c的话,那相当于是一个插数,呃,相当于是一个插入数据了,那对应的update如果现我们这里边有啊,D也删掉了啊,我们之前应该还有还有一一本身是七,如果我们把它变成十的话,那接下来肯定就做了一个更改了,不然我们也可以对应的用这个加,等于去做一个更新啊,这个我们就不详细的说了,运行一下。
12:02
你看现在得到的结果就多了,哎,C又添加进来了,E的值变成了十,整体来讲跟前面的put是一样的啊。底层的代码也是完全一样的,所以当然是没有问题的,最后呢,我们再来介绍一下,前面我们介绍都是针对一个集合做的产改查啊,那集合类型就是这些操作,那两个集合能不能做一些操作呢?呃,最简单的就像前面我们讲这个合并,合并这个列表,合并set一样啊,我们现在可以合并两个。Map这里边我们就要单独再去定义一个map啊,我们直接把这个map这里的MAP1COPY过来,它是一个,这是一个可变的,可那可变的map和可变的map可以相加吗?也是可以的啊,那可以合并在一起,比方说现在呢,我想把MAP2里边的所有元素都添加到当前的这个MAP1里边来啊,那当然了,现在这个MAP2里边好像都是MAP1里边有的元素啊,我这里边可以改一下,比方说楼是五是五,然后这个呢,加一个aaaaa就变成了。
13:15
目前MAP1里边没有的一个元素,那B呢,是MAP1里边有的元素,我也改一个,比方说是29,然后接下来我们看看是什么效果,整体来讲的话,我们要修改的是MAP1A是MAP1添加MAP2里面的东西,哎,那之前我们讲过加,那是可以加一个元素,那如果要是加一个集合呢。当然就是加加,哎,所以前面加等于添加嘛,那现在这个加加等于,那就是把MAP2里边的所有元素添加到MAP1里边来。接下来我们print line打印一下MAP1和MAP2里边的元素。我们看到MAP1里边元素除了啊,之前我们里边有的这些之外,另外呢,加入了MAP2里边的AAA。
14:08
另外我们会发现。B和哈,这两个T对应的值呢,都改成了MAP2里边对应的值,哎,所以这里边其实是MAP2里边的值全部添加到MAP1里边来,而且是要做一个覆盖,如果要是没有的话,直接添加,如果已经有对应的T的话,那就直接覆盖掉它的值,这是合并两个map做的具体的操作啊,那当然我们会想到,那能不能反过来MAP2去大加等于MAP1呢?这个当然不行,因为MAP2是不可变的嘛,不可变的集合类型,你直接用加加等于,这是要合并之后。直接要更改MAP2对吧,把MAP1的所有的那个元素要添加进去,这当然就不对了,它不能加加等于,但是呢,哎,我可以不要做赋值嘛,不要再全部,哎,MAP2改变嘛,但是可以得到的新的一个map对象,不给另外一个变量啊,当然了,这里边的这个MAP3我们可以看一眼它的类型。
15:15
比默认它是一个不可变的map这样的一个类型,直接把这个MAP3就放在这儿吧。那接下来我们可以直接看一下MAP1 map2 map3它们三个的里边的值到底是什么样子。Inline,我们这里直接会一个。分化线的分割,为了让大家看得更加清楚,因为前面我们这个MAP1和MAP2啊,这里边已经做过一次合并了,就相当于map map1里边已经有MAP2里边的所有元素了,然后我们再去做合并的时候,可能这个会不太明显啊,那所以呢,上边。
16:02
我们把这个MAP1这一步啊,先住掉。然后接下来看一下效果怎么样。我们看一下MAP1。诶,这个其实MAP1肯定是跟之前是没有改变的,MAP2当然也没有改变了,这样一个操作不会改变当前的任何一个集合,而三呢,那就是基于原先的MAP2,把MAP1里边大家看这是基于这个MAP2对吧,把MAP1里边。特有的MAP2里面没有的,像这个E,还有呃,对应的这个CA都要添加进来,而对应的如果已经有的对应的K的话,B和hello是要复成MAP1的里边的值啊,所以整整体来讲逻辑都是一样,就是把后边参数传进来的第二个map集合里边所有元素添加到前边的那些集合元素里边。那对应的就是如果有K的话,那就做一个修改。
17:02
得到的最终的这个集合类型就是合并了两个map之后的map结构,这就是关于可变map。所有可以做的操作。
我来说两句