如何检查 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 的空安全机制 | 变量可空性 | 默认变量不可赋空值 | 声明可空类型变量 )

Kotlin Spring bean 验证可空性

KotlinKotlin 与 Java 互操作 ① ( 变量可空性 | Kotlin 类型映射 | Kotlin 访问私有属性 | Java 调用 Kotlin 函数 )

Pyspark 模式:如何检查可空性?

Kotlin中与Java互操作与可空性类型映射属性访问@JvmOverloads@JvmField@JvmStatic@Throws和函数类型操作详解

Kotlin Model类在Json反序列化过程为空性探索