¿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 llamar a networkingucir en una matriz de Kotlin vacía?
  • Cómo sobrecargar constructores en kotlin difiere en el tipo de retorno lambda
  • Henetworkingar class con constructor primario
  • Cómo recuperar Objeto jSON secundario en Android Cuando se hace clic en un ListView
  • kartlin startactivity con banderas
  • Alcance de la variable definida en el encabezado de bucle for
  • Informes de Android Studio "No se pudo identificar la actividad de inicio: Actividad pnetworkingeterminada no encontrada" al crear proyectos de Kotlin
  • ¿Java.util.HashMap no implementa java.util.Map en Kotlin?
  • Spring REST, Kotin y los parameters primitivos pnetworkingeterminados conducen a un error
  • Java Stream con :: nuevo en Kotlin
  • Mejor forma de asignar objects de datos de Kotlin a objects de datos