解构声明:
在上一次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()的集合当中的。