接受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) })