解构声明:

在上一次​对Kotlin的解构声明进行了学习, 这里继续还是学习解构声明在集合中的应用:

解构声明与可变集合详解_javascript

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

解构声明与可变集合详解_泛型_02

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

解构声明与可变集合详解_泛型_03

解构声明与可变集合详解_javascript_04

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

解构声明与可变集合详解_泛型_05


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

解构声明与可变集合详解_数据_06


所以咱们可以这样写:

解构声明与可变集合详解_数据_07

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

解构声明与可变集合详解_泛型_08


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

解构声明与可变集合详解_javascript_09

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

解构声明与可变集合详解_泛型_10


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

解构声明与可变集合详解_泛型_11

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

可变集合:

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

解构声明与可变集合详解_数据_12

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

解构声明与可变集合详解_javascript_13


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

解构声明与可变集合详解_数据_14

接下来再看一个操作:

解构声明与可变集合详解_数据_15 

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

解构声明与可变集合详解_泛型_16

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

解构声明与可变集合详解_数据_17

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

解构声明与可变集合详解_javascript_18

解构声明与可变集合详解_泛型_19

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

解构声明与可变集合详解_泛型_20

解构声明与可变集合详解_javascript_21


解构声明与可变集合详解_javascript_22

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

解构声明与可变集合详解_泛型_23

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

解构声明与可变集合详解_数据_24

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

解构声明与可变集合详解_数据_25

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

解构声明与可变集合详解_javascript_26

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

解构声明与可变集合详解_javascript_27

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

解构声明与可变集合详解_javascript_28

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