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

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

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

例如:

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

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

2 Solutions collect form web for “如何在Java中轻松使用Kotlin渠道生产者?”

与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说明可以在这个答案中找到 。

  • 如何使用基于ThreadLocal和Kotlin协程的代码
  • Kotlin协同工具使用生产和mockito来嘲笑生产工作
  • Kotlin协程与超时
  • 在Kotlin协同程序中启动/连接和异步/等待之间有什么区别?
  • 未解决的参考:启动
  • Kotlin并行协程
  • 扇出/扇入结果通道
  • Kotlin协程中的“+”?
  • Spring 5和Kotlin 1.1协程:类型rx.Scheduler不存在
  • Kotlin并行协程
  • 使用Anko协程扩展的正确方法是什么?
  • Kotlin language will be the best programming language for Android.