将params作为参数传递给类扩展方法的函数

时间:2016-10-17 06:40:52

标签: kotlin

我正在尝试将函数作为参数传递给类扩展方法。

做的时候

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说类型不匹配

知道我应该如何将需要参数的函数传递给类扩展方法以及我应该如何调用它?

2 个答案:

答案 0 :(得分:4)

Kotlin 1.0.4中的对象尚不支持您尝试使用的语法(BusinessService :: listBusinesses),它仅适用于Kotlin 1.1(绑定可调用引用)。 看起来你只需要使用带有参数的lambda,无论是显式的还是隐式的: router.handleJsonGet(“/ business / list”){a - &gt; BusinessService.listBusinesses(a)} router.handleJsonGet(“/ business / list”){BusinessService.listBusinesses(it)} 演示它的简化示例: 对象BusinessService {     fun listBusinesses(any:Any):List&lt; String&gt; {         return listOf(“a”,“b”,“c”);     } } fun handleJsonGet(path:String,method :( Any) - &gt; Any){     val map:Map&lt; String,Int&gt; = mapOf(“a”到1)     方法(地图) } fun main(args:Array&lt; String&gt;){     handleJsonGet(“1”){BusinessService.listBusinesses(it)} }

答案 1 :(得分:0)

这样称呼:

WebDriver