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) }) 
  • Lanzamiento de Java & Kotlin con generics. Perder tipo de security
  • ¿Cómo puedo cambiar las reglas de resaltado de syntax para una variable con el modificador lateinit en IntelliJ (Kotlin)?
  • Obtener class acompañante en un object complementario
  • Posición de la label `@` en Kotlin cuando se denota el receptor con `this`
  • Cómo replace :: nuevo en kotlin?
  • Evite otra pausa de la aplicación de audio en YouTubePlayerFragment init
  • Kotlin y generics, implementando class genérica abstracta con matriz genérica
  • Herencia explícita de Any in Kotlin - ¿Puede y cómo se hace?
  • ¿Cómo comparo un Corto con un Int en Kotlin?
  • "No se encontraron las siguientes classs" con vista personalizada de Kotlin en el layout
  • Práctica recomendada para convertir el código de Java utilizado para copyr files de activos en la carpeta de caching de Android a Kotlin