解构声明与可变集合详解

解构声明:

在上一次https://www.cnblogs.com/webor2006/p/11519460.html对Kotlin的解构声明进行了学习, 这里继续还是学习解构声明在集合中的应用:

其中to是一个中缀表达式:

接下来遍历该map有多少方式,这里用解构声明的方式,如下:

可见是多么的简洁,对于map中的值如果我们想每个都做一些修改,这里可以用这个函数,如下:

 

可见是接收一个Lambda表达式,下面先看一下该函数的定义:

 

所以咱们可以这样写:

接下来应用一下解构声明:

 

貌似我们并没有用key嘛,所以,可以进一步简化:

其实Kotlin允许我们为解构声明整体指定类型,也就是如下:

 

也可以为每一个具体的component指定类型,如下:

所以,对于解构声明在实际中的用处还是挺多的。

可变集合:

在Kotlin中是严格区分可变集合和不可变集合的,要清楚的一点是:区分开可变集合的只读视图与实际上真正的不可变集合。下面来看个例子:

接下来构建一个只读视图:

 

那打印结果会是啥呢?运行一下:

接下来再看一个操作:

 

但是如果将readOnlyView的类型声明去掉就可以了:

很明显此时的readOnlyView变成了可变集合了,所以从这一点就可以证明在Kotlin是严格区分可变集合与不可变集合的,对于不可以集合List,很显然也不支持添加元素:

那List和MutableList在定义上有啥区别呢,看一下它们的定义就知道了:

其中可以发现它的泛型定义是用的协变:

 

所以这也是跟Java不同的,跟List类似,像Map也有对应的可变,如:

好,下面再用一下其它集合:

只读类型是协变的,因为它只用于从集合中获取数据,而不会修改集合中的数据,下面看下程序:

接下来再看一下快照的概念:

基中的toList扩展方法只是复制原集合中的元素,所以返回的集合就可以确保不会发生变化,下面看一下toList()方法的定义:

而toMutableList则是创建了一个新对象,如下:

所以说对于源数据的修改是不会反馈到这个toList()的集合当中的。

posted on 2019-09-14 22:35  cexo  阅读(318)  评论(0)    收藏  举报

导航