Kotlin 的 in 关键字
最后修改于 2025 年 4 月 19 日
Kotlin 的 in 关键字是一个多功能的操作符,用于范围检查和迭代。它简化了集合操作和范围比较。本教程通过实际例子深入探讨了 in 关键字。
基本定义
Kotlin 中的 in 关键字有两个主要用途。首先,它检查一个值是否在某个范围或集合内。其次,它允许对集合或范围进行迭代。该操作符可以通过 contains 函数重载。
使用 in 进行范围检查
in 的最简单用法是检查一个值是否在指定的范围内。这适用于数字范围、字符范围和自定义范围。
package com.zetcode
fun main() {
val x = 5
if (x in 1..10) {
println("$x is between 1 and 10")
}
val grade = 'B'
if (grade in 'A'..'D') {
println("$grade is a passing grade")
}
}
在这里,我们检查一个数字是否在 1-10 范围内,以及一个字符是否在 A-D 之间。 in 操作符使这些检查简洁易读。在这些例子中,这两个条件都评估为真。
集合成员资格检查
in 操作符可以检查一个元素是否存在于集合中。这适用于列表、集合、数组和其他集合类型。
package com.zetcode
fun main() {
val colors = listOf("red", "green", "blue")
if ("green" in colors) {
println("Green is in the list")
}
val numbers = setOf(1, 2, 3, 5, 8)
println(4 in numbers) // Output: false
}
我们检查 "green" 是否存在于颜色列表中,以及 4 是否存在于数字集合中。第一个检查返回真,而第二个检查返回假。 in 操作符在内部调用 contains 方法。
使用 in 进行迭代
in 关键字允许在 for 循环中对范围和集合进行迭代。这为循环操作提供了简洁的语法。
package com.zetcode
fun main() {
for (i in 1..5) {
print("$i ") // Output: 1 2 3 4 5
}
println()
val fruits = listOf("apple", "banana", "cherry")
for (fruit in fruits) {
print("$fruit ") // Output: apple banana cherry
}
}
第一个循环迭代从 1 到 5 的数字范围。第二个循环遍历水果列表。 in 关键字使这些循环简洁易懂。
自定义 in 操作符
您可以通过在您的类中实现 contains 函数来为 in 操作符定义自定义行为。这使您可以在自定义类型上进行类似范围的操作。
package com.zetcode
class Week(val days: List<String>) {
operator fun contains(day: String) = day in days
}
fun main() {
val week = Week(listOf("Mon", "Tue", "Wed", "Thu", "Fri"))
println("Wed" in week) // Output: true
println("Sun" in week) // Output: false
}
在这里,我们创建了一个实现了 contains 的 Week 类。这允许我们使用 in 来检查一天是否在一周内。该操作符为此成员资格检查提供了自然的语法。
not in 操作符
Kotlin 还提供了 !in 操作符来检查一个值是否不在某个范围或集合中。这是 in 操作符的逻辑反面。
package com.zetcode
fun main() {
val primes = setOf(2, 3, 5, 7, 11)
val num = 4
if (num !in primes) {
println("$num is not prime")
}
val validChars = 'a'..'z'
println('$' !in validChars) // Output: true
}
我们检查 4 是否不在质数集合中,以及 '$' 是否不在有效的小写字母范围内。这两个条件都评估为真。 !in 操作符提高了负面检查的代码可读性。
字符串包含检查
in 操作符可以检查一个子字符串是否存在于一个字符串中。这提供了 contains 方法的简洁替代方案。
package com.zetcode
fun main() {
val message = "Hello Kotlin"
if ("Kot" in message) {
println("Substring found")
}
val forbidden = listOf("spam", "ads", "virus")
val email = "Buy cheap ads now!"
if (forbidden.any { it in email }) {
println("Spam detected")
}
}
我们检查 "Kot" 是否存在于一个字符串中,以及任何禁止的单词是否出现在一封电子邮件中。 in 操作符使这些检查变得简单明了。第二个例子将 in 与 any 结合使用,以进行更复杂的检查。
Map 键检查
in 操作符可以检查一个键是否存在于一个 map 中。这提供了一种干净的方法来验证 map 成员资格,而无需显式调用方法。
package com.zetcode
fun main() {
val capitals = mapOf(
"USA" to "Washington",
"UK" to "London",
"France" to "Paris"
)
if ("France" in capitals) {
println("Capital of France is ${capitals["France"]}")
}
println("Germany" in capitals) // Output: false
}
我们检查 "France" 和 "Germany" 是否是首都 map 中的键。 in 操作符使这些检查简洁。在检查 map 键时, in 比调用 containsKey 更具可读性。
in 操作符的最佳实践
- 为了可读性,优先使用 in: 尽可能使用
in代替contains,以获得更简洁的代码。 - 与范围结合使用: 将
in与范围表达式结合使用,以进行简洁的边界检查。 - 实现 contains: 对于自定义类型,实现
contains以启用in操作符支持。 - 使用 !in 进行负面检查:
!in操作符为缺失检查提供了清晰的语法。 - 考虑性能: 对于大型集合,请注意
in复杂度可能为 O(n),除非使用 Set。
来源
本教程深入介绍了 Kotlin 的 in 关键字,展示了它在范围检查、集合成员资格和迭代中的使用。我们探讨了各种场景,包括自定义实现和字符串操作。 in 操作符为常见操作提供了简洁易读的语法。
作者
列出 所有 Kotlin 教程。