📜  Kotlin – 集合操作概述

📅  最后修改于: 2022-05-13 01:55:48.942000             🧑  作者: Mango

Kotlin – 集合操作概述

Kotlin 标准库提供了广泛的函数来对集合执行操作。它包括简单的操作,如获取或添加元素,也包括更复杂的操作,如搜索、排序、过滤等。

成员和扩展功能 -

集合操作以两种方式声明:

  • 成员函数
  • 扩展功能

成员函数——

它定义了集合类型所必需的操作。例如,Collection 包含用于检查其是否为空的函数isEmpty() ; List 包含get()用于对元素进行索引访问,等等。
我们必须在创建自己的集合接口实现时实现成员函数。为了更容易地创建新的实现,我们可以使用 Kotlin 标准库中集合接口的骨架实现,例如AbstractListAbstractSetAbstractMap以及它们的可变对应物。

扩展函数——

除了成员函数之外的所有操作都被声明为扩展函数。其中一些是过滤、转换、排序和其他集合处理功能。

常见操作——

通用操作可用于可变集合(读取和写入)和只读。常见操作分为以下几类:

  • 转型
  • 过滤
  • 加号和减号运算符
  • 分组
  • 检索收集部件
  • 检索单个元素
  • 订购
  • 聚合操作

上面讨论的所有操作都返回它们的结果,而不影响集合的原始内容。例如,当我们应用于过滤操作时,它会生成一个新集合,其中包含与过滤谓词匹配的所有元素。这些操作的结果应该存储在变量中,或者可以传递给其他函数。
使用过滤器操作的 Kotlin 程序 –

Kotlin
fun main() {
    val str = mutableListOf("Geeks", "for", "Geeks", "A", "Computer", "Portal")
 
    // original collection remains same
    str.filter { it.length > 4 }
    println("Original collection elements still unchanged $str")
 
    // result is stored in newStr
    val newStr = str.filter { it.length > 4 }
    println("New Collection obtains after filtering $newStr")
}


Kotlin
fun main() {
 
    val str = listOf("Geeks", "for", "Geeks", "A", "Computer", "Portal")
 
    //destination object
    val filterResults = mutableListOf()
    str.filterTo(filterResults) { it.length > 5 }
    str.filterIndexedTo(filterResults) { index, _ -> index == 0 }
 
    // filterResults contains results of both operations
    println("Combined Result of both operations $filterResults")
}


Kotlin
fun main() {
    val str = listOf("Geeks", "for", "Geeks", "A", "Computer", "Portal")
 
    // filter strings right into a new hash set,
    // and eliminating duplicates in the result
    val result = str.mapTo(HashSet()) { it.length }
 
    // print hashset
    println("Only Distinct item length return by hashset $result")
}


Kotlin
fun main() {
    val units = mutableListOf("Ten","Hundred","Thousand","Lakh","Crore")
    // sorted() creates new collection and sort
    val sortedNumbers = units.sorted()
 
    println(units == sortedNumbers) // false
    // sort() sort in same collection
    units.sort()
 
    println(units == sortedNumbers) // true
}


输出:

Original collection elements still unchanged [Geeks, for, Geeks, A, Computer, Portal]
New Collection obtains after filtering [Geeks, Geeks, Computer, Portal]

对于有限的收集操作,我们可以指定目标对象,它是可选的。 Destination 应该是可变集合,函数将其结果项添加到该集合中,而不是在新对象中返回它们。要对目的地执行这些操作,我们可以在名称中使用 To 后缀符号来分隔函数,例如,使用filterTo()而不是filter()
Kotlin 使用目标对象的程序——

科特林

fun main() {
 
    val str = listOf("Geeks", "for", "Geeks", "A", "Computer", "Portal")
 
    //destination object
    val filterResults = mutableListOf()
    str.filterTo(filterResults) { it.length > 5 }
    str.filterIndexedTo(filterResults) { index, _ -> index == 0 }
 
    // filterResults contains results of both operations
    println("Combined Result of both operations $filterResults")
}

输出:

Combined Result of both operations [Computer, Portal, Geeks]

正如我们上面讨论的,我们可以将集合操作结果传递给另一个函数,这些函数将目标集合返回回来,因此我们可以在函数调用的相应参数中直接创建它:
Kotlin 将结果存储在 Hashset 中的程序 -

科特林

fun main() {
    val str = listOf("Geeks", "for", "Geeks", "A", "Computer", "Portal")
 
    // filter strings right into a new hash set,
    // and eliminating duplicates in the result
    val result = str.mapTo(HashSet()) { it.length }
 
    // print hashset
    println("Only Distinct item length return by hashset $result")
}

输出:

Only Distinct item length return by hashset [1, 3, 5, 6, 8]

写操作——

还有一些写操作可以在可变集合的情况下改变集合状态。这些操作包括添加、删除和更新集合中的元素。写操作在 List 特定操作和 Map 特定操作的 Write 操作和相应部分中列出。
对于特定的操作,有成对的函数用于对集合执行相同的操作:第一个可以在原地应用操作,即在原始集合中执行操作,另一个将结果作为新的单独集合返回。
例如:在应用sort()操作时,它会就地对可变集合进行排序,因此它的状态会发生变化,但在sorted()操作的情况下,它会创建一个新集合,其中包含排序顺序中的相同元素。
Kotlin 程序使用 sort() 和 sorted() 操作——

科特林

fun main() {
    val units = mutableListOf("Ten","Hundred","Thousand","Lakh","Crore")
    // sorted() creates new collection and sort
    val sortedNumbers = units.sorted()
 
    println(units == sortedNumbers) // false
    // sort() sort in same collection
    units.sort()
 
    println(units == sortedNumbers) // true
}

输出:

false
true