【问题标题】:kotlin: call higher-order function with multiple lambdaskotlin:使用多个 lambda 调用高阶函数
【发布时间】:2018-02-08 19:44:44
【问题描述】:

是否可以调用具有多个 lambda 函数的函数?

如果是这样,我该如何调用以下函数?

fun post(path: String, 
         params: JSONObject, 
         completionHandler: (response: JSONObject?) -> Unit, 
         errorCompletionHandler: (error: VolleyError?) -> Unit
)

【问题讨论】:

    标签: android lambda kotlin higher-order-functions


    【解决方案1】:

    是的,您可以拥有任意数量的 lambda。显示的post 可以如下调用:

    post("/a", "json", {response-> println(response) }, { error-> println(error)})
    

    也可以按照documentation 中的描述将最后一个 lambda 从括号中取出:

    在 Kotlin 中,有一个约定,如果函数的最后一个参数是函数,并且您将 lambda 表达式作为相应的参数传递,则可以在括号外指定它。

    应用于您的代码,这意味着:

    post("/a", "json", { response -> println(response) }) { error ->
        println(error)
    }
    

    【讨论】:

      【解决方案2】:

      您将定义如下所示的 lambda。您可以将它们分配给变量以使代码更具可读性。如果您的 lambda 变大,这将变得特别方便。

      val completionHandler: (JSONObject?) -> Unit = { response -> 
          // ...
      }
      
      val errorCompletionHandler: (VolleyError?) -> Unit = { error -> 
          // ...
      }
      
      post("/path", jsonObject, completionHandler, errorCompletionHandler)
      

      或者您可以定义使用引用传递的函数:

      fun errorCompletionHandler(error: VolleyError?) {}
      fun completionHandler(response: JSONObject?) {}
      
      post("/path", jsonObject, ::completionHandler, ::errorCompletionHandler)
      

      注意Unit 可以在此处省略,因为如果没有指定其他内容,它是隐式返回类型。

      【讨论】:

      • 您也可以使用命名参数来提高可读性,而不建议多次使用 lambda:post("/path", jsonObject,\ncompletionHandler = { response->...},\nerrorCompletionHandler = ...)\n 代表换行符)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      相关资源
      最近更新 更多