
上QQ阅读APP看书,第一时间看更新
5.1.2 视图
在使用函数式编程、使用并发或编写异步应用程序时,使用不可变集合要安全得多。Java中的大多数集合都是可变的,但是最近几年Java引入了不可变的版本。不过,缺点是Java中集合的可变和不可变版本都实现了相同的接口。因此,任何修改不可变集合的尝试,例如,对列表使用add()方法,都会在运行时产生UnsupportedOperationException。Kotlin不想让你等那么久才知道操作是无效的。这就是视图的由来。
Kotlin为列表、集合和映射提供了两种不同的视图:只读或不可变视图,以及读写或可变视图。在Java中,这两个视图只是映射到相同的底层集合。当使用这些视图而不是原始集合时,没有运行时开销,并且在编译时或运行时没有转换。只读视图只允许读操作,任何使用只读引用进行写入的尝试都会在编译时失败。
例如,List和MutableList都是围绕ArrayList的Kotlin视图,但是使用List引用在索引处添加元素或设置值的操作都会在编译时失败。
需要注意的是——不要假设使用只读视图可以提供线程安全性。只读引用是对可变集合的引用,即使你不能修改该集合,也不能保证所引用的集合在另一个线程中没有被修改。同样地,如果对同一个实例使用多个视图,其中一些视图是只读的,而另一些视图是读写的,那么必须格外小心地验证没有两个线程在同一时间使用读写接口来修改集合。
我们将首先介绍Pair和Triple,然后再转到其他更复杂、更强大的集合。