Kotlin !in 关键字
最后修改于 2025 年 4 月 19 日
Kotlin 的 `!in` 运算符用于检查集合或范围中是否存在某个元素。它是 `in` 运算符的否定形式。本教程将通过实际例子深入探讨 `!in` 关键字。
基本定义
Kotlin 中的 `!in` 关键字是一个否定运算符,它检查一个元素是否不在集合或范围内。当元素不存在时,它返回 true,当元素存在时,它返回 false。它适用于所有支持 `in` 运算符的类型。
检查列表中不存在的元素
`!in` 最常见的用法是检查一个元素是否不在列表中。这比写 `!(element in list)` 更具可读性。该示例展示了在字符串列表中的基本用法。
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` 运算符可用于检查一个值是否在范围之外。这对于验证输入值或检查边界条件很有用。该示例演示了数值范围检查。
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` 检查键是否存在。这在你希望避免覆盖现有条目时很有用。该示例展示了键不存在的检查。
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` 运算符可以检查一个字符是否不在字符串中。这对于输入验证或文本处理很有用。该示例演示了字符检查。
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` 检查的自定义范围类。
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`。
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` 从处理中排除某些类型。
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 运算符的最佳实践
- 优先使用 !in 而非否定形式: 使用 `!in` 而不是 `!(x in y)`,以获得更好的可读性。
- 使用有意义的名称: 清晰地命名集合/范围,使 `!in` 检查具有自文档性。
- 与 when 结合使用: `!in` 在 when 表达式中很好地用于排除模式。
- 考虑性能: 对于大型集合,请注意 `!in` 在列表中执行线性搜索。
- 谨慎扩展: 仅当 `in`/`!in` 语义有意义时,才为自定义类实现 `contains()`。
来源
本教程深入探讨了 Kotlin 的 `!in` 关键字,展示了如何检查集合、范围和自定义类型中不存在的元素。我们探索了各种场景,包括字符串、Map 和智能类型转换。正确使用 `!in` 可以使您的排除检查更具可读性和表达力。
作者
列出 所有 Kotlin 教程。