如何在Java中轻松使用Kotlin渠道生产者?

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

作为改进长期运行过程的一部分,我想使用协程。 具体来说, kotlinx.courtines包中的渠道生产者 。

例如:

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

在Java中使用这个最好的方法是什么? 我可以为Kotlin和/或Java添加临时的“帮手”功能。

与Java互操作的渠道最简单的方法是通过反应流。 Rx和Project Reactor都支持开箱即用。 例如,将kotlinx-coroutines-rx2添加到dependsicies,您将能够使用rxFlowable构建器:

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

这个函数返回一个Flowable的实例,这个实例是专门为了Java的易用Flowable而设计的,例如,你可以用Java来实现:

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

目前,假设使用了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说明可以在这个答案中找到 。