集合操作概览
Kotlin 标准库提供了各种各样的函数,用于对集合执行操作。这包括获取或添加元素等简单操作,也包括搜索、排序、过滤、转换等更复杂的操作。
扩展函数与成员函数
集合操作在标准库中以两种方式声明:集合接口的成员函数与扩展函数。
成员函数定义了对于集合类型至关重要的操作。例如,Collection 包含用于检查是否为空的函数 isEmpty();List 包含用于通过索引访问元素的 get(),依此类推。
当你创建自己的集合接口实现时,必须实现其成员函数。为了简化新实现的创建,请使用标准库中集合接口的骨架实现:AbstractCollection、AbstractList、AbstractSet、AbstractMap 及其对应的可变版本。
其他集合操作被声明为扩展函数。这些包括过滤、转换、排序以及其他集合处理函数。
常用操作
常用操作适用于只读集合与可变集合。常用操作分为以下几类:
这些页面中描述的操作会返回结果,而不会影响原始集合。例如,过滤操作会产生一个包含所有符合过滤谓词元素的新集合。此类操作的结果应存储在变量中,或以其他方式使用(例如传递给其他函数)。
fun main() {
val numbers = listOf("one", "two", "three", "four")
numbers.filter { it.length > 3 } // numbers 没有任何变化,结果丢失了
println("numbers are still $numbers")
val longerThan3 = numbers.filter { it.length > 3 } // 结果存储在 longerThan3 中
println("numbers longer than 3 chars are $longerThan3")
}对于某些集合操作,可以选择指定目标对象。目标是一个可变集合,函数会将结果项附加到该对象中,而不是将其作为新对象返回。对于带目标的集合操作,有专门的函数,其名称带有 To 后缀,例如,使用 filterTo() 而不是 filter(),或者使用 associateTo() 而不是 associate()。这些函数将目标集合作为一个额外参数。
fun main() {
val numbers = listOf("one", "two", "three", "four")
val filterResults = mutableListOf<String>() // 目标对象
numbers.filterTo(filterResults) { it.length > 3 }
numbers.filterIndexedTo(filterResults) { index, _ -> index == 0 }
println(filterResults) // 包含两次操作的结果
}为方便起见,这些函数会返回目标集合,因此你可以在函数调用的相应参数中直接创建它:
fun main() {
val numbers = listOf("one", "two", "three", "four")
// 将 numbers 直接过滤到新的 hash set 中,
// 从而消除结果中的重复项
val result = numbers.mapTo(HashSet()) { it.length }
println("distinct item lengths are $result")
}带有目标的函数适用于过滤、关联、分组、展平以及其他操作。有关目标操作的完整列表,请参阅 Kotlin 集合参考文档。
写入操作
对于可变集合,还存在更改集合状态的写入操作。此类操作包括添加、移除和更新元素。写入操作列在写入操作以及 List 特有操作和 Map 特有操作的相应章节中。
对于某些操作,存在成对的函数来执行相同的操作:一个就地应用操作,另一个将结果作为单独的集合返回。例如,sort() 就地对可变集合进行排序,因此其状态会发生变化;而 sorted() 会创建一个新集合,其中包含按排序顺序排列的相同元素。
fun main() {
val numbers = mutableListOf("one", "two", "three", "four")
val sortedNumbers = numbers.sorted()
println(numbers == sortedNumbers) // false
numbers.sort()
println(numbers == sortedNumbers) // true
}