如何在Kotlin中比较Triple时忽略指定组件?
在Kotlin中匹配Triple时忽略指定组件的解决方案
你说得没错,直接在when分支里用Triple(_, 0, 0)这种写法是不合法的——_只能在解构声明里用来忽略变量,没法直接作为Triple的构造参数使用。不过我们有几种实用的方式来实现你想要的匹配逻辑:
方法一:解构后结合when条件判断
最直接的方式是先解构Triple的三个组件,然后在when的条件分支里明确写出需要忽略的组件的判断逻辑:
val coordinates = Triple(3, 2, 5) val (x, y, z) = coordinates when { x == 0 && y == 0 && z == 0 -> println("Origin") y == 0 && z == 0 -> println("On the x-axis.") // 忽略x的值,只判断y和z为0 x == 0 && z == 0 -> println("On the y-axis.") // 忽略y的值,只判断x和z为0 x == 0 && y == 0 -> println("On the z-axis.") // 忽略z的值,只判断x和y为0 else -> println("Somewhere in space") }
这种写法清晰直观,适合简单的匹配场景,不需要额外的工具函数。
方法二:给Triple扩展匹配函数
如果需要多次复用这类匹配逻辑,可以给Triple定义扩展函数,把判断逻辑封装起来,让代码更简洁:
// 给任意数值类型的Triple扩展匹配函数 fun <T : Number> Triple<T, T, T>.isOrigin() = first.toInt() == 0 && second.toInt() == 0 && third.toInt() == 0 fun <T : Number> Triple<T, T, T>.isOnXAxis() = second.toInt() == 0 && third.toInt() == 0 fun <T : Number> Triple<T, T, T>.isOnYAxis() = first.toInt() == 0 && third.toInt() == 0 fun <T : Number> Triple<T, T, T>.isOnZAxis() = first.toInt() == 0 && second.toInt() == 0 // 使用示例 val coordinates = Triple(3, 2, 5) when { coordinates.isOrigin() -> println("Origin") coordinates.isOnXAxis() -> println("On the x-axis.") coordinates.isOnYAxis() -> println("On the y-axis.") coordinates.isOnZAxis() -> println("On the z-axis.") else -> println("Somewhere in space") }
这里我给Triple加了泛型约束(限定为Number类型),如果你的Triple是特定类型(比如Int),可以直接去掉泛型,简化函数实现。
方法三:结合解构的when主语写法
还有一种更紧凑的写法,把解构放在when的主语位置,这样可以在分支里直接引用解构后的变量:
val coordinates = Triple(3, 2, 5) when (val (x, y, z) = coordinates) { Triple(0, 0, 0) -> println("Origin") Triple(x, 0, 0) -> println("On the x-axis.") // 利用x匹配任意值,固定y和z为0 Triple(0, y, 0) -> println("On the y-axis.") Triple(0, 0, z) -> println("On the z-axis.") else -> println("Somewhere in space") }
这种写法更贴近你最初的思路,本质上和方法一逻辑一致,只是通过创建对应Triple实例来完成匹配。
以上几种方法都能实现你想要的“忽略Triple指定组件进行匹配”的需求,你可以根据实际场景选择最适合的方式。
内容的提问来源于stack exchange,提问作者Dick Lucas
相关产品推荐
相关产品推荐

