【发布时间】:2018-01-29 16:31:55
【问题描述】:
如何在 Kotlin 中检查 lambda 是否为空? 例如,我有像
这样的签名onError:(Throwable) -> Unit = {}
我有什么区别是它的默认值来自正文还是应用于此函数的值?
【问题讨论】:
标签: android function lambda kotlin
如何在 Kotlin 中检查 lambda 是否为空? 例如,我有像
这样的签名onError:(Throwable) -> Unit = {}
我有什么区别是它的默认值来自正文还是应用于此函数的值?
【问题讨论】:
标签: android function lambda kotlin
您无法测试 lambda 的主体是否为空(因此它不包含源代码),但您可以通过为该值创建一个常量并将其用作默认值来检查 lambda 是否是您的默认值。比您还可以检查该值是否为默认值:
fun main(args: Array<String>) {
foo()
foo { }
foo { println("Bar") }
}
private val EMPTY: (Throwable) -> Unit = {}
fun foo(onError: (Throwable) -> Unit = EMPTY) {
if (onError === EMPTY) {
// the default value is used
} else {
// a lambda was defined - no default value used
}
}
【讨论】:
只是不要使用空的 lambdas 作为默认值。
由于在 kotlin 中可空性是一等公民并且明确指示缺失值,我会将 null 作为默认参数传递。
onError: ((Throwable) -> Unit)? = null
签名看起来有点丑,但我觉得值得。
例如,它可以很容易地检查和处理,并且您不会期望 lambda 会做一些有用的事情 - 特别是对于具有返回值的 lambda。
我在这里给出了相同的评论:https://stackoverflow.com/a/38793639/3917943
【讨论】:
我不相信有办法检查 lambda 是否包含可执行代码(至少据我所知不是),但您可以执行以下操作:
fun foo(onError: ((Throwable) -> Unit)? = null) {
if (onError != null) {
// do something
} else {
// do something else
}
}
【讨论】: