获取单个元素
Kotlin 集合提供了一组用于从集合中获取单个元素的函数。 本页所述的函数既适用于列表也适用于集合。
正如列表的定义所述,列表是一个有序集合。 因此,列表的每个元素都有其位置,您可以以此进行引用。 除了本页描述的函数外,列表还提供了更多通过索引获取和搜索元素的途径。 有关更多详细信息,请参阅列表特定操作。
反之,根据定义,集合不是有序集合。 然而,Kotlin Set 按特定顺序存储元素。 这些顺序可以是插入顺序(在 LinkedHashSet 中)、自然排序顺序(在 SortedSet 中)或其他顺序。 一组元素的顺序也可能是未知的。 在这种情况下,元素仍然以某种方式排序,因此依赖于元素位置的函数仍然会返回结果。 但是,除非调用者了解所使用的 Set 的具体实现,否则这些结果对调用者来说是不可预测的。
按位置获取
要获取特定位置的元素,可以使用 elementAt() 函数。 调用它时传入一个整数作为实参,您将获得集合中该给定位置的元素。 第一个元素的位置为 0,最后一个元素为 (size - 1)。
elementAt() 对于不提供索引访问或静态未知是否提供索引访问的集合非常有用。 对于 List,使用索引访问运算符(get() 或 [])更符合习惯。
fun main() {
val numbers = linkedSetOf("one", "two", "three", "four", "five")
println(numbers.elementAt(3))
val numbersSortedSet = sortedSetOf("one", "two", "three", "four")
println(numbersSortedSet.elementAt(0)) // 元素按升序存储
}还有一些用于获取集合第一个和最后一个元素的有用别名:first() 和 last()。
fun main() {
val numbers = listOf("one", "two", "three", "four", "five")
println(numbers.first())
println(numbers.last())
}为了在获取不存在位置的元素时避免异常,请使用 elementAt() 的安全变体:
elementAtOrNull()在指定位置超出集合边界时返回 null。elementAtOrElse()另外接受一个 lambda 表达式,该表达式将Int实参映射到集合元素类型的实例。当使用越界位置调用时,elementAtOrElse()返回 lambda 表达式在给定值上的结果。
fun main() {
val numbers = listOf("one", "two", "three", "four", "five")
println(numbers.elementAtOrNull(5))
println(numbers.elementAtOrElse(5) { index -> "The value for index $index is undefined"})
}按条件获取
函数 first() 和 last() 还允许您在集合中搜索匹配给定谓词的元素。当您使用测试集合元素的谓词调用 first() 时,您将获得谓词结果为 true 的第一个元素。反之,带谓词的 last() 返回匹配该谓词的最后一个元素。
fun main() {
val numbers = listOf("one", "two", "three", "four", "five", "six")
println(numbers.first { it.length > 3 })
println(numbers.last { it.startsWith("f") })
}如果没有元素匹配谓词,这两个函数都会抛出异常。要避免异常,请改用 firstOrNull() 和 lastOrNull():如果未发现匹配元素,它们将返回 null。
fun main() {
val numbers = listOf("one", "two", "three", "four", "five", "six")
println(numbers.firstOrNull { it.length > 6 })
}如果别名的名称更适合您的情况,请使用别名:
- 使用
find()代替firstOrNull() - 使用
findLast()代替lastOrNull()
fun main() {
val numbers = listOf(1, 2, 3, 4)
println(numbers.find { it % 2 == 0 })
println(numbers.findLast { it % 2 == 0 })
}使用选择器获取
如果您需要在获取元素之前对集合进行映射,可以使用 firstNotNullOf() 函数。它结合了 2 个操作:
- 使用选择器函数映射集合
- 返回结果中的第一个非 null 值
如果结果集合中没有非 null 元素,firstNotNullOf() 将抛出 NoSuchElementException。在这种情况下,请使用对应的 firstNotNullOfOrNull() 来返回 null。
fun main() {
val list = listOf<Any>(0, "true", false)
// 将每个元素转换为字符串,并返回第一个具有所需长度的元素
val longEnough = list.firstNotNullOf { item -> item.toString().takeIf { it.length >= 4 } }
println(longEnough)
}随机元素
如果您需要获取集合中的任意元素,请调用 random() 函数。您可以不带实参调用它,也可以使用 Random 对象作为随机源。
fun main() {
val numbers = listOf(1, 2, 3, 4)
println(numbers.random())
}在空集合上,random() 会抛出异常。要改为接收 null,请使用 randomOrNull()
检查元素是否存在
要检查集合中是否存在某个元素,请使用 contains() 函数。如果集合中存在与函数实参 equals() 的元素,它将返回 true。您可以使用 in 关键字以运算符形式调用 contains()。
要一次性检查多个实例是否存在,请调用 containsAll(),并传入这些实例的集合作为实参。
fun main() {
val numbers = listOf("one", "two", "three", "four", "five", "six")
println(numbers.contains("four"))
println("zero" in numbers)
println(numbers.containsAll(listOf("four", "two")))
println(numbers.containsAll(listOf("one", "zero")))
}此外,您还可以通过调用 isEmpty() 或 isNotEmpty() 来检查集合是否包含任何元素。
fun main() {
val numbers = listOf("one", "two", "three", "four", "five", "six")
println(numbers.isEmpty())
println(numbers.isNotEmpty())
val empty = emptyList<String>()
println(empty.isEmpty())
println(empty.isNotEmpty())
}