¿Cómo consumir fácilmente un productor de canal Kotlin en Java?

Como parte de trabajar en el desarrollo de una nueva API, estoy aprendiendo a usar Kotlin. Inicialmente quiero que la API de Kotlin se use dentro de un proyecto Java (Android), pero a largo ploop espero adoptar Kotlin por completo.

Como parte de la mejora de la implementación de un process de larga duración, quiero usar coroutines. Específicamente, un productor de kotlinx.courtines package kotlinx.courtines .

Por ejemplo:

 fun exampleProducer() = produce { send("Hello") delay(1000) send("World") } 

¿Cuál es la mejor manera de consumir esto en Java? Estoy de acuerdo en agregar funciones temporales de 'ayuda' a Kotlin y / o Java.

La forma más fácil de interoperar canales con Java es a través de flujos reactivos. Tanto Rx como Project Reactor son compatibles desde el primer momento. Por ejemplo, agregue kotlinx-coroutines-rx2 a sus dependientes y podrá usar rxFlowable :

 fun exampleFlowable() = rxFlowable<String> { send("Hello") delay(1000) send("World") } 

Esta function devuelve una instancia de Flowable , que está específicamente diseñada para la facilidad de uso de Java, por ejemplo, puede hacerlo en Java:

 exampleFlowable().subscribe(t -> System.out.print(t)); 

Actualmente, suponiendo que Java 8 se utiliza y las lambdas están disponibles, confío en una function de ayuda definida en Kotlin que permite pasar una callback para consumir los resultados entrantes.

El método de ayuda en Kotlin:

 fun exampleProducerCallback( callback: (String) -> Unit ) = runBlocking { exampleProducer().consumeEach { callback( it ) } } 

Esto se consume en Java como:

 ApiKt.exampleProducerCallback( text -> { System.out.print( text ); return Unit.INSTANCE; // Needed since there is no void in Kotlin. } ); 

En esta respuesta se puede encontrar una explicación de por qué se necesita return Unit.INSTANCE .

  • ¿Cómo prohibir las llamadas a funciones con un cierto subtipo de un tipo de parámetro?
  • Error al hacer que Enum sea la key principal en la biblioteca de la database de la sala
  • Kotlin - No coincide el tipo: Obligatorio: Cadena, Encontrado: () -> Cadena
  • Kotlin JS - cadena de conversión de numbers?
  • ¿Hay alguna forma de desactivar la covarianza del sitio de uso en Kotlin?
  • Es var str: cadena mutable o inmutable?
  • Kotlin: ¿Cómo obtengo caracteres después de "@" en una cadena?
  • ¿Cómo se especifican los parameters de tipo para el constructor principal en Kotlin?
  • Compara una vista de text con una string en Kotlin
  • ¿Cómo implementar el module de piso para cada tipo de número en Kotlin?
  • Mejora en el análisis de Java / Kotlin JSON