作为开发新API的一部分,我正在学习使用Kotlin。最初我希望Kotlin API在Java(Android)项目中使用,但从长远来看,我希望完全采用Kotlin。
作为改进长期运行流程实现的一部分,我想使用协同程序。具体而言,来自kotlinx.coroutines
包的channel producer。
例如:
fun exampleProducer() = produce {
send("Hello")
delay(1000)
send("World")
}
在Java中使用它的最佳方法是什么?我可以在Kotlin和/或Java中添加临时的“帮助”功能。
答案 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。