Android 如何在Java中轻松使用Kotlin频道生成器?

Android 如何在Java中轻松使用Kotlin频道生成器?,android,kotlin,kotlin-interop,kotlinx.coroutines,Android,Kotlin,Kotlin Interop,Kotlinx.coroutines,作为开发新API工作的一部分,我正在学习使用Kotlin。最初我希望Kotlin API能在Java(Android)项目中使用,但从长远来看,我希望完全采用Kotlin 作为改进长时间运行流程实现的一部分,我希望使用协程。具体地说,是来自kotlinx.coroutines包的 例如: fun exampleProducer() = produce { send("Hello") delay(1000) send("World") } 在Java中使用它的最佳方式是什

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

作为改进长时间运行流程实现的一部分,我希望使用协程。具体地说,是来自
kotlinx.coroutines
包的

例如:

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

在Java中使用它的最佳方式是什么?我可以向Kotlin和/或Java添加临时“helper”函数。

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

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.
} );

解释为什么需要返回Unit.INSTANCE。

与Java交互通道的最简单方法是通过反应流。Rx和项目反应堆都是开箱即用的。例如,将
kotlinx-coroutines-rx2
添加到依赖项中,您将能够使用
rxFlowable
生成器:

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

我对科特林完全陌生,不知道这是否是惯用语。我只是发布了我目前的解决方案,让你知道我现在在哪里。也许有更好的替代方案?一个明显的改进是使用
回调:Consumer
。工作非常完美,尽管我选择在我的情况下使用
rxObservable
(我不期望背压)。
exampleFlowable().subscribe(t -> System.out.print(t));