如何检查 kotlin 中的 lambda 空性
Posted
技术标签:
【中文标题】如何检查 kotlin 中的 lambda 空性【英文标题】:How to check lambda emptiness in kotlin 【发布时间】:2018-01-29 16:31:55 【问题描述】:如何在 Kotlin 中检查 lambda 是否为空? 例如,我有像
这样的签名onError:(Throwable) -> Unit =
我有什么区别是它的默认值来自正文还是应用于此函数的值?
【问题讨论】:
【参考方案1】:您无法测试 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
【讨论】:
【参考方案2】:只是不要使用空的 lambdas 作为默认值。
由于在 kotlin 中可空性是一等公民并且明确指示缺失值,我会将 null 作为默认参数传递。
onError: ((Throwable) -> Unit)? = null
签名看起来有点丑,但我觉得值得。
例如,它可以很容易地检查和处理,并且您不会期望 lambda 会做一些有用的事情 - 特别是对于具有返回值的 lambda。
我在这里给出了相同的评论:https://***.com/a/38793639/3917943
【讨论】:
【参考方案3】:我不相信有办法检查 lambda 是否包含可执行代码(至少据我所知不是),但您可以执行以下操作:
fun foo(onError: ((Throwable) -> Unit)? = null)
if (onError != null)
// do something
else
// do something else
【讨论】:
以上是关于如何检查 kotlin 中的 lambda 空性的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin空安全 ① ( Kotlin 的空安全机制 | 变量可空性 | 默认变量不可赋空值 | 声明可空类型变量 )
KotlinKotlin 与 Java 互操作 ① ( 变量可空性 | Kotlin 类型映射 | Kotlin 访问私有属性 | Java 调用 Kotlin 函数 )
Kotlin中与Java互操作与可空性类型映射属性访问@JvmOverloads@JvmField@JvmStatic@Throws和函数类型操作详解