如何在 Java 中轻松消费 Kotlin 频道生产者?

How to easily consume a Kotlin channel producer in Java?

作为开发新 API 的一部分,我正在学习使用 Kotlin。最初我希望 Kotlin API 在 Java (Android) 项目中使用,但从长远来看,我希望完全采用 Kotlin。

作为改进长期 运行 流程实施的一部分,我想使用协程。具体来说,来自 kotlinx.coroutines 包的 channel producer

例如:

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

在 Java 中最好的消费方式是什么?我可以向 Kotlin and/or Java.

添加临时 'helper' 函数

目前,假设使用 Java 8 并且 lambda 可用,我依赖于 Kotlin 中定义的辅助函数,它允许传递回调以使用传入的结果。

Kotlin 中的辅助方法:

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

然后在 Java 中消耗为:

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

解释为什么需要 return Unit.INSTANCE

与 Java 互操作频道的最简单方法是通过 Reactive Streams。 Rx 和 Project Reactor 都是开箱即用的。例如,将 kotlinx-coroutines-rx2 添加到您的依赖关系中,您将能够使用 rxFlowable builder:

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

这个函数 returns Flowable 的一个实例,它是专门为 Java 的易用性而设计的,例如,你可以在 Java :

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