Skip to content

集合操作概览

Kotlin 标准库提供了多种多样的函数,用于对集合执行操作。这包括简单的操作,例如获取或添加元素,以及更复杂的操作,包括搜索、排序、过滤、转换等。

扩展函数和成员函数

集合操作在标准库中有两种声明方式:集合接口的成员函数扩展函数

成员函数定义了集合类型所必需的操作。例如,Collection 包含 isEmpty() 函数用于检查其是否为空;List 包含 get() 用于按索引访问元素,等等。

当你创建自己的集合接口实现时,你必须实现它们的成员函数。为了更方便地创建新的实现,请使用标准库中集合接口的骨架实现:AbstractCollectionAbstractListAbstractSetAbstractMap 及其可变对应项。

其他集合操作则声明为扩展函数。这些包括过滤、转换、排序以及其他集合处理函数。

常见操作

常见操作适用于只读集合和可变集合两者。常见操作分为以下几组:

这些页面上描述的操作返回其结果,而不影响原始集合。例如,过滤操作会生成一个包含所有匹配过滤谓词的元素_新集合_。此类操作的结果应存储在变量中,或以其他方式使用,例如作为参数传递给其他函数。

kotlin

fun main() {
    val numbers = listOf("one", "two", "three", "four")  
    numbers.filter { it.length > 3 }  // nothing happens with `numbers`, result is lost
    println("numbers are still $numbers")
    val longerThan3 = numbers.filter { it.length > 3 } // result is stored in `longerThan3`
    println("numbers longer than 3 chars are $longerThan3")
}

对于某些集合操作,可以选择指定_目标_对象。目标是一个可变集合,函数会将结果项追加到该集合中,而不是在新对象中返回它们。为了执行带有目标的(destination)操作,存在名称中带有 To 后缀的独立函数,例如 filterTo() 而不是 filter()associateTo() 而不是 associate()。这些函数将目标集合作为附加参数。

kotlin

fun main() {
    val numbers = listOf("one", "two", "three", "four")
    val filterResults = mutableListOf<String>()  //destination object
    numbers.filterTo(filterResults) { it.length > 3 }
    numbers.filterIndexedTo(filterResults) { index, _ -> index == 0 }
    println(filterResults) // contains results of both operations
}

为了方便起见,这些函数会返回目标集合,因此你可以在函数调用的相应参数中直接创建它:

kotlin

fun main() {
    val numbers = listOf("one", "two", "three", "four")
    // filter numbers right into a new hash set, 
    // thus eliminating duplicates in the result
    val result = numbers.mapTo(HashSet()) { it.length }
    println("distinct item lengths are $result")
}

带有目标(destination)的函数可用于过滤、关联、分组、扁平化及其他操作。有关目标操作的完整列表,请参阅 Kotlin 集合参考

写入操作

对于可变集合,还有改变集合状态的_写入操作_。此类操作包括添加、删除和更新元素。写入操作列在写入操作以及List 特有操作Map 特有操作的相应部分中。

对于某些操作,存在执行相同操作的成对函数:一个是在位应用操作,另一个则将结果作为单独的集合返回。例如,sort() 会在位(in-place)排序可变集合,因此其状态会改变;而 sorted() 则创建一个包含相同元素且已排序的新集合。

kotlin

fun main() {
    val numbers = mutableListOf("one", "two", "three", "four")
    val sortedNumbers = numbers.sorted()
    println(numbers == sortedNumbers)  // false
    numbers.sort()
    println(numbers == sortedNumbers)  // true
}