kotlin:用多个lambdas调用高阶函数

时间:2018-02-08 19:44:45

标签: android lambda kotlin higher-order-functions

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

如果是,我该如何调用以下功能?

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

2 个答案:

答案 0 :(得分:3)

是的,你可以拥有任意数量的lambdas。显示的post可以按如下方式调用:

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

documentation中所述,也可以从括号中提取最后一个lambda:

  

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

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

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

答案 1 :(得分:1)

您将定义lambdas,如下所示。您可以将它们分配给变量以使代码更具可读性。如果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可以在这里省略,因为如果没有指定其他内容,它就是隐式返回类型。