You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:26:51