如何用Kotlin闭包实现支持短路特性的逻辑与(AND)操作?
没问题,我来教你实现带短路特性的myAnd闭包!
实现带短路特性的
myAnd闭包 首先得说清楚你原来的实现为什么不支持短路:你的vararg flags: Boolean写法会提前计算所有传入的布尔表达式——哪怕前面已经出现false,后面的someFunction()还是会被调用,这就违背了逻辑与的短路特性(前面为false时,后面的表达式无需执行)。
正确的实现方案
我们需要让每个布尔表达式延迟执行,只有当前面的所有条件都为true时,才去计算下一个条件。在Kotlin里,用() -> Boolean类型的lambda就能实现这种延迟计算:
fun myAnd(vararg conditions: () -> Boolean): Boolean { // 遍历每个延迟执行的条件 for (condition in conditions) { // 执行当前条件,如果返回false,直接返回结果,后面的条件不会被执行 if (!condition()) { return false } } // 所有条件都为true,返回true return true }
用法示例
假设我们有这样一个测试函数:
fun someFunction(): Boolean { println("someFunction 被执行了") return true }
调用myAnd的时候,把每个布尔表达式包装成lambda:
fun main() { val result = myAnd( { 23 < 34 }, // 第一个条件:true { false }, // 第二个条件:false,触发短路 { someFunction() } // 这个条件不会被执行! ) println(result) // 输出:false }
运行这段代码你会发现,控制台不会打印someFunction 被执行了,说明短路特性生效了——第二个条件返回false后,后面的表达式根本没机会执行。
更简洁的调用方式
如果你觉得每次写{}有点繁琐,还可以利用Kotlin的尾随lambda语法,或者定义一个拓展函数让调用更自然。比如拓展Boolean类型:
infix fun Boolean.and(next: () -> Boolean): Boolean { return this && next() } // 调用示例 val result = (23 < 34) and { false } and { someFunction() }
这种写法同样支持短路特性,而且看起来更贴近自然语言。
内容的提问来源于stack exchange,提问作者aman5319
相关产品推荐
相关产品推荐

