接受params作为类扩展方法的参数的函数

我试图将一个函数作为参数传递给类扩展方法。

当做

fun Router.handleJsonGet(path: String, method: () -> Any) { this.get(path).handler { it.response().putHeader("Content-Type", "application/json").end((gson.toJson(method()))) } } 

我可以轻松地在一个lambda函数中调用函数,一切工作正常。

 router.handleJsonGet("/business/list", { BusinessService.listBusinesses() }) 

现在我想包括一个GET参数的地图,我陷入了困境。

 fun Router.handleJsonGet(path: String, method: (any:Any) -> Any) { this.get(path).handler { val map: MultiMap = it.request().params() ?: MultiMap.caseInsensitiveMultiMap() it.response().putHeader("Content-Type", "application/json").end((gson.toJson(method(map)))) } } 

我现在如何使用这种方法扩展? 当函数需要参数时,wrap-with-lambda技巧似乎不起作用。

我期待的是:

 router.handleJsonGet("/business/list", BusinessService::listBusinesses) 

 object BusinessService { fun listBusinesses(any: Any) : List<Business> { // do something with any as MultiMap return Business.findAllBusinesss(); } } 

工作,但IntelliJ说类型不匹配

任何想法,我应该如何传递一个函数,需要一个参数类扩展方法,我应该如何调用它?

您试图使用的语法( BusinessService::listBusinesses )目前还不支持Kotlin 1.0.4中的object ,它只针对Kotlin 1.1 (Bound可调用引用)进行计划。

似乎你只需要使用带有参数的lambda表达式 ,无论是显式的还是隐式的:

 router.handleJsonGet("/business/list") { a -> BusinessService.listBusinesses(a) } 

 router.handleJsonGet("/business/list") { BusinessService.listBusinesses(it) } 

演示它的简单示例:

 object BusinessService { fun listBusinesses(any: Any): List<String> { return listOf("a", "b", "c"); } } fun handleJsonGet(path: String, method: (Any) -> Any) { val map: Map<String, Int> = mapOf("a" to 1) method(map) } fun main(args: Array<String>) { handleJsonGet("1") { BusinessService.listBusinesses(it) } } 

像这样调用它:

 router.handleJsonGet("/business/list", { BusinessService.listBusinesses(anyParamHere) })