ZetCode

Kotlin 的 in 关键字

最后修改于 2025 年 4 月 19 日

Kotlin 的 in 关键字是一个多功能的操作符,用于范围检查和迭代。它简化了集合操作和范围比较。本教程通过实际例子深入探讨了 in 关键字。

基本定义

Kotlin 中的 in 关键字有两个主要用途。首先,它检查一个值是否在某个范围或集合内。其次,它允许对集合或范围进行迭代。该操作符可以通过 contains 函数重载。

使用 in 进行范围检查

in 的最简单用法是检查一个值是否在指定的范围内。这适用于数字范围、字符范围和自定义范围。

RangeCheck.kt
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 操作符可以检查一个元素是否存在于集合中。这适用于列表、集合、数组和其他集合类型。

CollectionCheck.kt
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 循环中对范围和集合进行迭代。这为循环操作提供了简洁的语法。

Iteration.kt
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 操作符定义自定义行为。这使您可以在自定义类型上进行类似范围的操作。

CustomIn.kt
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
}

在这里,我们创建了一个实现了 containsWeek 类。这允许我们使用 in 来检查一天是否在一周内。该操作符为此成员资格检查提供了自然的语法。

not in 操作符

Kotlin 还提供了 !in 操作符来检查一个值是否不在某个范围或集合中。这是 in 操作符的逻辑反面。

NotIn.kt
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 方法的简洁替代方案。

StringContains.kt
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 操作符使这些检查变得简单明了。第二个例子将 inany 结合使用,以进行更复杂的检查。

Map 键检查

in 操作符可以检查一个键是否存在于一个 map 中。这提供了一种干净的方法来验证 map 成员资格,而无需显式调用方法。

MapCheck.kt
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 操作符的最佳实践

来源

Kotlin 运算符重载文档

本教程深入介绍了 Kotlin 的 in 关键字,展示了它在范围检查、集合成员资格和迭代中的使用。我们探讨了各种场景,包括自定义实现和字符串操作。 in 操作符为常见操作提供了简洁易读的语法。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有多年的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我写了 1400 多篇文章和 8 本电子书。我有超过八年的编程教学经验。

列出 所有 Kotlin 教程