¿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 .

  • Android Kotlin Extension super calling
  • Cómo llamar al constructor String de Java (char , int offset, int length) de Kotlin?
  • Dagger2: instancia duplicada en DoubleCheck
  • Boolean - Conversión de int en Kotlin
  • Implementación de una anotación de Java en Kotlin
  • Cómo verificar si los datos se insertan en la database de la sala
  • Prueba de integración de spring - No se inyectó AuthenticationPrincipal
  • Clases de datos en Kotlin
  • Accediendo a las properties de bean Java desde Kotlin
  • Cómo replace todas las apariciones de una cadena secundaria en kotlin
  • Realizar la adición de forma concisa en las properties de la class en Kotlin