ZetCode

Kotlin !in 关键字

最后修改于 2025 年 4 月 19 日

Kotlin 的 `!in` 运算符用于检查集合或范围中是否存在某个元素。它是 `in` 运算符的否定形式。本教程将通过实际例子深入探讨 `!in` 关键字。

基本定义

Kotlin 中的 `!in` 关键字是一个否定运算符,它检查一个元素是否不在集合或范围内。当元素不存在时,它返回 true,当元素存在时,它返回 false。它适用于所有支持 `in` 运算符的类型。

检查列表中不存在的元素

`!in` 最常见的用法是检查一个元素是否不在列表中。这比写 `!(element in list)` 更具可读性。该示例展示了在字符串列表中的基本用法。

ListCheck.kt
package com.zetcode

fun main() {

    val colors = listOf("red", "green", "blue")
    val color = "yellow"
    
    if (color !in colors) {
        println("$color is not in the list")
    }
}

在这里,我们检查 "yellow" 是否不在 colors 列表中。由于它不存在,条件判断为真,并打印该消息。这比否定 `in` 检查更清晰。

检查范围中不存在的元素

`!in` 运算符可用于检查一个值是否在范围之外。这对于验证输入值或检查边界条件很有用。该示例演示了数值范围检查。

RangeCheck.kt
package com.zetcode

fun main() {

    val validRange = 1..100
    val value = 105
    
    if (value !in validRange) {
        println("$value is out of valid range")
    }
}

我们检查 105 是否在 1..100 范围之外。由于它确实如此,条件为真,并打印该消息。这比写 `!(value in validRange)` 更简洁。

检查 Map 中不存在的元素

对于 Map,`!in` 检查键是否存在。这在你希望避免覆盖现有条目时很有用。该示例展示了键不存在的检查。

MapCheck.kt
package com.zetcode

fun main() {

    val capitals = mapOf(
        "France" to "Paris",
        "Germany" to "Berlin"
    )
    
    val country = "Spain"
    
    if (country !in capitals) {
        println("$country is not in the map")
    }
}

我们检查 "Spain" 是否不是 capitals Map 中的一个键。由于它不存在,该消息将被打印出来。请注意,`!in` 在 Map 集合中检查的是键,而不是值。

检查字符串中不存在的元素

`!in` 运算符可以检查一个字符是否不在字符串中。这对于输入验证或文本处理很有用。该示例演示了字符检查。

StringCheck.kt
package com.zetcode

fun main() {

    val vowels = "aeiou"
    val letter = 'z'
    
    if (letter !in vowels) {
        println("$letter is not a vowel")
    }
}

我们检查 'z' 是否不在 vowels 字符串中。由于它不存在,该消息将被打印出来。这是一种干净的方式来检查输入验证中排除的字符。

使用 !in 的自定义类

为了使自定义类能够与 `!in` 一起使用,它们必须实现 `contains()` 函数。该示例展示了一个支持 `!in` 检查的自定义范围类。

CustomClass.kt
package com.zetcode

class TemperatureRange(val min: Int, val max: Int) {
    operator fun contains(temp: Int) = temp in min..max
}

fun main() {

    val validTemps = TemperatureRange(10, 30)
    val currentTemp = 35
    
    if (currentTemp !in validTemps) {
        println("$currentTemp°C is dangerous")
    }
}

TemperatureRange 类实现了 `contains()` 以支持 `in` 和 `!in`。我们检查 35°C 是否在有效范围之外。由于它确实如此,警告消息将被打印出来。这展示了如何将 `!in` 扩展到自定义类型。

!in 与 when 表达式

`!in` 运算符可以很好地与 Kotlin 的 `when` 表达式一起使用,用于简洁的条件逻辑。该示例演示了在 when 表达式中使用 `!in`。

WhenExpression.kt
package com.zetcode

fun main() {

    val forbidden = setOf("admin", "root", "system")
    val username = "guest"
    
    when (username) {
        !in forbidden -> println("Access granted")
        else -> println("Access denied")
    }
}

我们检查 "guest" 是否不在禁止的用户名集合中。由于它不存在,"Access granted" 消息将被打印出来。这展示了 `!in` 如何简化排除检查的 when 表达式。

!in 与智能类型转换

将 `!in` 与智能类型转换结合使用,可以进行强大的类型安全检查。该示例展示了如何使用 `!in` 从处理中排除某些类型。

SmartCast.kt
package com.zetcode

fun process(value: Any) {
    if (value !in listOf(1, 2, 3)) {
        println("Processing $value")
    }
}

fun main() {

    process(4) // Output: Processing 4
    process(2) // No output
}

该函数处理的数值不是 1、2 或 3。`!in` 检查与智能类型转换相结合,使这种排除清晰而简洁。这种模式对于过滤输入非常有用。

!in 运算符的最佳实践

来源

Kotlin 运算符重载文档

本教程深入探讨了 Kotlin 的 `!in` 关键字,展示了如何检查集合、范围和自定义类型中不存在的元素。我们探索了各种场景,包括字符串、Map 和智能类型转换。正确使用 `!in` 可以使您的排除检查更具可读性和表达力。

作者

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

列出 所有 Kotlin 教程