Kotlin 集合详解
Kotlin严格区分可变集合与不可变集合。
要清楚的一点是:区分开可变集合的只读视图与实际上真正的不可变集合
Kotlin
的 List<out T>
类型是一个提供只读操作如size
、get
等的接口。与 Java 类似,它继承自Collection<T>
进而继承自 Iterable<T>
。改变 list
的方法是由 MutableList<T>
加入的。
list 及 set 类型的基本用法:
val numbers: MutableList<Int> = mutableListOf(1, 2, 3)
val readOnlyView: List<Int> = numbers
println(numbers) // 输出 "[1, 2, 3]"
numbers.add(4)
println(readOnlyView) // 输出 "[1, 2, 3, 4]"
readOnlyView.clear() // -> 不能编译
val strings = hashSetOf("a", "b", "c", "c")
assert(strings.size == 3)
Kotlin
没有专门的语法结构创建list
或 set
。 要用标准库的方法,如listOf()
、 mutableListOf()
、 setOf()
、 mutableSetOf()
。
注意上面的 readOnlyView 变量指向相同的底层 list 并会随之改变。 如果一个 list 只存在只读引用,我们可以考虑该集合完全不可变。创建一个这样的集合的一个简单方式如下:
val items = listOf(1, 2, 3)
目前 listOf
方法是使用 array list
实现的。
注意这些类型是协变的这意味着,你可以把一个 List<Rectangle>
赋值给 List<Shape>
假定 Rectangle
继承自Shape
。对于可变集合类型这是不允许的,因为这将导致运行时故障。
有时你想给调用者返回一个集合在某个特定时间的一个快照, 一个保证不会变的:
class Controller {
private val _items = mutableListOf<String>()
val items: List<String> get() = _items.toList()
}
这个 toList 扩展方法只是复制列表项,因此返回的 list 保证永远不会改变。
一些扩展方法
al items = listOf(1, 2, 3, 4)
items.first() == 1
items.last() == 4
items.filter { it % 2 == 0 } // 返回 [2, 4]
val rwList = mutableListOf(1, 2, 3)
rwList.requireNoNulls() // 返回 [1, 2, 3]
if (rwList.none { it > 6 }) println("No items above 6") // 输出“No items above 6”
val item = rwList.firstOrNull()
val readWriteMap = hashMapOf("foo" to 1, "bar" to 2)
println(readWriteMap["foo"]) // 输出“1”
val snapshot: Map<String, Int> = HashMap(readWriteMap)
示例代码
fun main(args: Array<String>) {
val stringList: MutableList<String> = mutableListOf("hello", "world", "hello world")
val readOnlyView: List<String> = stringList
println(stringList)
stringList.add("welcome")
println(readOnlyView)
println("------------")
val strings: HashSet<String> = hashSetOf("a", "b", "c", "c")
println(strings.size)
println("------------")
//只读类型是协变的,因为它只用于从集合中获取数据,而不会修改集合中的数据
val s = listOf("a", "b")
val s2: List<Any> = s
println("-----------")
//快照
//toList扩展方法只是复制原集合中的元素,所以返回的集合就可以确保不会发生变化
val items = mutableListOf("a", "b", "c")
val items2 = items.toList()
items.add("d")
println(items)
println(items2)
}
输出结果
[hello, world, hello world]
[hello, world, hello world, welcome]
------------
3
------------
-----------
[a, b, c, d]
[a, b, c]
示例代码
fun main(args: Array<String>) {
val items = listOf(1,2,3,4)
println(items.first())
println(items.last())
items.filter { it % 2 == 0 }.forEach { println(it) }
println("--------------")
val myList = mutableListOf(1,2,3)
println(myList.requireNoNulls())
if (myList.none{ it > 10 }){
println("没有大于10的元素")
}
println(myList.firstOrNull())
println(myList.lastOrNull())
println("-------------")
val myMap = hashMapOf("hello" to 1,"world" to 2)
println(myMap["hello"])
val myMap2: Map<String,Int> = HashMap(myMap)
println(myMap2)
}
输出
1
4
2
4
--------------
[1, 2, 3]
没有大于10的元素
1
3
-------------
1
{hello=1, world=2}