Pase la function que recibe params como parámetro al método de extensión de class

Estoy tratando de pasar una function como parámetro a un método de extensión de class.

Cuando haces

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

Puedo ajustar fácilmente una llamada de function dentro de una lambda y todo está funcionando bien.

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

Ahora quiero include un map de GET params y me estoy atascado.

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

¿Cómo hago uso de esta extensión de método ahora? El truco wrap-with-lambda no parece funcionar cuando la function requiere un parámetro.

Esperaba algo como:

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

con

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

para trabajar, pero IntelliJ dice que el tipo no coincide

¿Alguna idea de cómo debería pasar una function que requiere un parámetro a un método de extensión de class y cómo debería llamarlo?

La syntax que intentó usar ( BusinessService::listBusinesses ) todavía no se admite para los object en Kotlin 1.0.4, solo está planificada para Kotlin 1.1 (references BusinessService::listBusinesses ).

Parece que solo necesitas usar lambda con argumento , ya sea explícito o implícito:

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

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

Ejemplo simplificado que lo demuestra:

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

Llámalo así:

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