¿Hay alguna forma mejor de escribir invocaciones de CompletableFutrue.XXXasync () en kotlin?

Java CompletableFuture<T> tiene muchos methods asíncronos, estáticos o de instancia, en este formatting

 public <U> CompletableFuture<U> XXXasync(SomeFunctionalInterface<T> something, Executor executor) 

Si tiene suficiente experiencia con FP en kotlin, inmediatamente se dará count de que estas funciones son extremadamente incómodas de usar en kotlin, porque la interfaz SAM no es el último parámetro.

 aCompletableFutrue.thenComposeAsync(Function<SomeType, CompletableFuture<SomeOtherType>> { // ^ WHAT A LONG TYPE NAME THAT NEED TO BE HAND WRITTEN // do something that has to be written in multiple lines. // for that sake of simplicity I use convert() to represent this process convert(it) }, executor) 

Esa Function tiene una firma genérica muy larga que no sé cómo generar IDE. Será un simple error si el nombre del tipo se vuelve aún más largo o contiene un tipo parametrizado o tiene annotations de varianza de tipo.

También se ve desagradable por el final , executor) en la línea 5.

¿Hay alguna funcionalidad faltante en kotlin o IDE que pueda ayudar con la situación? Al less no quiero escribir ese largo constructor de SAM solo.


Soluciones rechazadas:

  1. El uso de un parámetro con nombre no parece funcionar porque esta function solo funciona en una function de kotlin.

  2. Abandonar los methods asíncronos suena mal desde el principio.

  3. Kotlin corountine es rechazado porque estamos trabajando con algunas tontas bibliotecas de Java que solo aceptan CompletionStage .

SI llama a la API de Java que finalmente tiene un parámetro de interfaz funcional, puede simplemente usar lambda en kotlin.

 val composed: CompletableFuture<String> = aCompletableFutrue.thenComposeAsync { CompletableFuture.supplyAsync { it.toString() } }; 

En segundo lugar , si no te gusta la firma del método java api. puede escribir sus propios methods de extensión, por ejemplo:

 fun <T, U> CompletableFuture<T>.thenComposeAsync(executor: Executor , mapping: Function1<in T, out CompletionStage<U>>): CompletableFuture<U> { return thenComposeAsync(Function<T,CompletionStage<U>>{mapping(it)}, executor) } 

ENTONCES puedes hacer la lambda a lo largo del método.

 aCompletableFutrue.thenComposeAsync(executor){ // do working } 
  • Especificando <K, V> escriba 'Pair <K, V> `
  • ¿Usando rasgos con classs de datos en Kotlin?
  • IntelliJ (usando gradle): no se puede encontrar el complemento de Kotlin aunque esté instalado
  • ¿Cuál es la mejor manera de declarar en el componente UI en Android con Kotlin?
  • Los types de plataforma de llamada de Kotlin dan como resultado llegalStateException
  • Una variable no puede asignarse a 2
  • cómo usar DecoratingStringHashMapper con kotlin?
  • kotlin y @Valid Spring anotación
  • Asynchronization de reference no resuelta en Kotlin
  • Cómo manejar la intención con Kotlin y el conductor
  • Resaltado de syntax de ojo de pez / crisol para Kotlin