一、创建集合
创建集合的最常用方法是使用标准库函数 listOf<T>()、setOf<T>()、mutableListOf<T>()、mutableSetOf<T>()。 如果以逗号分隔的集合元素列表作为参数,编译器会自动检测元素类型。创建空集合时,须明确指定类型。
val numbersSet = setOf("one", "two", "three", "four")
val emptySet = mutableSetOf<String>()
Map 也有这样的函数 mapOf()与 mutableMapOf()。映射的键和值作为 Pair 对象传递(通常使用中缀函数 to 创建)。
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 1)
注意,to 符号创建了一个短时存活的 Pair 对象,因此建议仅在性能不重要时才使用它。为避免过多的内存使用,请使用其他方法。例如,可以创建可写 Map 并使用写入操作填充它。 apply()函数可以帮助保持初始化流畅。
val numbersMap = mutableMapOf<String, String>().apply { this["one"] = "1"; this["two"] = "2" }
还有用于创建没有任何元素的集合的函数:emptyList()、emptySet()与 emptyMap()。 创建空集合时,应指定集合将包含的元素类型。
val empty = emptyList<String>()
具体类型构造函数:
val linkedList = LinkedList<String>(listOf("one", "two", "three"))
val presizedSet = HashSet<Int>(32)
复制:
在特定时刻通过集合复制函数,例如toList()、toMutableList()、toSet()等等。创建了集合的快照。 结果是创建了一个具有相同元素的新集合 如果在源集合中添加或删除元素,则不会影响副本。副本也可以独立于源集合进行更改。
这些函数还可用于将集合转换为其他类型,例如根据 List 构建 Set:
val sourceList = mutableListOf(1, 2, 3)
val copySet = sourceList.toMutableSet()
copySet.add(3)
copySet.add(4)
println(copySet)
二、迭代器
通过迭代器遍历集合:
val numbers = listOf("one", "two", "three", "four")
val numbersIterator = numbers.iterator()
while (numbersIterator.hasNext()) {
println(numbersIterator.next())
}
遍历 Iterable 集合的另一种方法是众所周知的 for 循环
val numbers = listOf("one", "two", "three", "four")
for (item in numbers) {
println(item)
}
通过forEach遍历:
val numbers = listOf("one", "two", "three", "four")
numbers.forEach {
println(it)
}
List 迭代器:
对于列表,有一个特殊的迭代器实现: ListIterator它支持列表双向迭代:正向与反向。 反向迭代由 hasPrevious()和 previous()函数实现。 此外, ListIterator 通过 nextIndex() 与 previousIndex()函数提供有关元素索引的信息。
val numbers = listOf("one", "two", "three", "four")
val listIterator = numbers.listIterator()
while (listIterator.hasNext()) listIterator.next()
println("Iterating backwards:")
while (listIterator.hasPrevious()) {
print("Index: ${listIterator.previousIndex()}")
println(", value: ${listIterator.previous()}")
}
具有双向迭代的能力意味着 ListIterator 在到达最后一个元素后仍可以使用。
可变迭代器:
为了迭代可变集合,于是有了 MutableIterator来扩展 Iterator 使其具有元素删除函数 remove()。因此,可以在迭代时从集合中删除元素。
val numbers = mutableListOf("one", "two", "three", "four")
val mutableIterator = numbers.iterator()
mutableIterator.next()
mutableIterator.remove()
println("After removal: $numbers")
除了删除元素, MutableListIterator还可以在迭代列表时插入和替换元素。
val numbers = mutableListOf("one", "four", "four")
val mutableListIterator = numbers.listIterator()
mutableListIterator.next()
mutableListIterator.add("two")
mutableListIterator.next()
mutableListIterator.set("three")
println(numbers)
三、序列
除了集合之外,Kotlin 标准库还包含另一种容器类型——序列(Sequence<T>)。 序列提供与 Iterable 相同的函数。
创建序列:
val numbersSequence = sequenceOf("four", "three", "two", "one")
将 Iterable 转成 Sequence:
val numbers = listOf("one", "two", "three", "four")
val numbersSequence = numbers.asSequence()
基于函数创建无限序列:
val oddNumbers = generateSequence(1) { it + 2 } // 创建无限序列
println(oddNumbers.take(6).toList()) // 取前6个元素,返回长度为6的序列
基于函数创建有限序列:
val oddNumbersLessThan10 = generateSequence(1) { if (it + 2 < 10) it + 2 else null }
println(oddNumbersLessThan10.count())