Quiero crear un CompletableFuture con un valor de retorno que se ejecute en un ejecutor específico en Kotlin.
El siguiente código funciona bien.
return CompletableFuture.supplyAsync { val commandHandler = registry.get<TCommand, TResponse>(command::class.java) commandHandler.handle(command) }Sin embargo, cuando intento pasar el ejecutor, no se compila.
return CompletableFuture.supplyAsync({ val commandHandler = registry.get<TCommand, TResponse>(command::class.java) commandHandler.handle(command) }, exec)Traté de ser inteligente y escribí la versión de Java e hice que Intellij la convirtiera en Kotlin, pero esa también tenía el mismo error. ¿Qué estoy haciendo mal aquí?
EDITAR:
Puedo hacer que funcione haciendo lo siguiente, pero parece innecesario. ¿Alguien puede explicar por qué esto funciona pero otros métodos no? ¿Hay otras formas de escribir este código?
return CompletableFuture.supplyAsync(Supplier { commandHandler.handle(command) }, exec)No sé exactamente, por qué no está funcionando. Pero lo siguiente funciona:
return CompletableFuture.supplyAsync({ val commandHandler = registry.get<TCommand, TResponse>(command::class.java) commandHandler.handle(command) }, exec::execute)Como puede ver, cambié el segundo parámetro a una referencia de método. Ahora la firma del método es:
supplyAsync(supplier: () -> U, executor: (Runnable)-> Unit)Si pasas directamente al Ejecutor, Kotlin elige la firma:
supplyAsync(supplier: Supplier<U>, executor: Executor)Parece que no se puede mezclar la interfaz y el estilo lambda.