kotlin:我可以使用闭包中的合格 return 吗?

kotlin: can I use qualified return from a closure?

我想记录&return来自供应商的空值。

不记录这个工作正常:

    fun check_plain(supplier: Supplier<String?>) {
        val arg: String = supplier.get() ?: return
        // do checking
    }

但是如果我也登录 elvis,我会得到一个错误:

    fun check_log(supplier: Supplier<String?>) {
        val arg: String = supplier.get() ?: {
            logger.info { "Nothing interesting here" }
            return@check_log // 'return' is not allowed here
        }
        // do checking
    }

我解决了它,但它不等价,我放弃了正式的不可空性:

    fun check_if(supplier: Supplier<String?>) {
        val arg: String? = supplier.get().also {
            if (it == null) {
                logger.info { "Nothing interesting here" }
                return@check_if
            }
        }
        // do checking
    }

我能以某种方式保留猫王吗?

return 在那里是不允许的,因为 lambda 没有内联。有关详细信息,请参阅 the language spec

对于这个简单的案例,你可以这样做:

val arg: String = supplier.get() ?: return logger.info { "Nothing interesting here" }

如果您有更多的语句想要 运行,请使用 run:

val arg: String = supplier.get() ?: return run {
    logger.info { ... }
    logger.info { ... }
    logger.info { ... }
}

或:

val arg: String = supplier.get() ?: run {
    logger.info { ... }
    logger.info { ... }
    logger.info { ... }
    return
}

请注意 return 允许在 run 中使用 因为 run 是内联的。