如何在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
说明可以在这个答案中找到 。
- 在apk中使用Kotlin构建DuplicateFileException
- 升级到kotlin RC1(1.0.0-rc-1036)之后的java.lang.IncompatibleClassChangeError
- 从Java迁移到Kotlin
- 在Kotlin中定义log TAG常量的最好方法是什么?
- Kotlin懒惰的默认属性
- Kotlin Android视图绑定:findViewById vs Butterknife vs Kotlin Android扩展
- 在OnLongPress Android中处理ACTION_UP
- :运行单元测试时出现app:kaptDebugKotlin错误
- Android Studio / Kotlin – 无效错误“覆盖方法应该调用超级”