【问题标题】:How to check lambda emptiness in kotlin如何检查 kotlin 中的 lambda 空性
【发布时间】:2018-01-29 16:31:55
【问题描述】:

如何在 Kotlin 中检查 lambda 是否为空? 例如,我有像

这样的签名
onError:(Throwable) -> Unit = {}

我有什么区别是它的默认值来自正文还是应用于此函数的值?

【问题讨论】:

    标签: android function lambda kotlin


    【解决方案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://stackoverflow.com/a/38793639/3917943

      【讨论】:

        【解决方案3】:

        我不相信有办法检查 lambda 是否包含可执行代码(至少据我所知不是),但您可以执行以下操作:

        fun foo(onError: ((Throwable) -> Unit)? = null) {
            if (onError != null) {
                // do something
            } else {
                // do something else
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多