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

时间:2017-11-10 17:36:53

标签: android kotlin kotlin-interop kotlinx.coroutines

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

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

例如:

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

在Java中使用它的最佳方法是什么?我可以在Kotlin和/或Java中添加临时的“帮助”功能。

2 个答案:

答案 0 :(得分:2)

使用Java互操作通道的最简单方法是通过Reactive Streams。 Rx和Project Reactor都支持开箱即用。例如,将kotlinx-coroutines-rx2添加到您的相关政策中,您就可以使用rxFlowable内容:

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

此函数返回Flowable的实例,该实例专为Java的易用性而设计,例如,您可以使用Java实现:

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

答案 1 :(得分:1)

目前,假设使用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 can be found in this answer