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

  • ¿Por qué mi configuration de RxJava está bloqueando mi subprocess de interfaz de usuario? Trabajar con la callback BluetoothAdapter.startLeScan
  • ¿Cómo serializar / deserializar una matriz de objects personalizados en Kotlin?
  • ¿Cómo seleccionar un module diferente para ejecutar cuando haces clic en el button Ejecutar en IntelliJ IDEA?
  • Android Studio no aplica mis cambios de layout
  • java.lang.reflect.InvocationTargetException al usar la biblioteca Kotlin-Mokito
  • La "coincidencia de patrón" no funciona para la cláusula Int (twig)
  • Android: ¿Cómo llamar a la function ndk de Kotlin?
  • Cómo upload files a S3 Amazon por Okhttp3 y Android
  • Kotlin JS - cadena de conversión de numbers?
  • ¿Kotlin proporciona mejoras en el performance?
  • En Kotlin, ¿cómo puedo groupBy tipo