如何在 Java 中轻松消费 Kotlin 频道生产者?
How to easily consume a Kotlin channel producer in Java?
作为开发新 API 的一部分,我正在学习使用 Kotlin。最初我希望 Kotlin API 在 Java (Android) 项目中使用,但从长远来看,我希望完全采用 Kotlin。
作为改进长期 运行 流程实施的一部分,我想使用协程。具体来说,来自 kotlinx.coroutines
包的 channel producer。
例如:
fun exampleProducer() = produce {
send("Hello")
delay(1000)
send("World")
}
在 Java 中最好的消费方式是什么?我可以向 Kotlin and/or Java.
添加临时 'helper' 函数
目前,假设使用 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
。
与 Java 互操作频道的最简单方法是通过 Reactive Streams。 Rx 和 Project Reactor 都是开箱即用的。例如,将 kotlinx-coroutines-rx2
添加到您的依赖关系中,您将能够使用 rxFlowable
builder:
fun exampleFlowable() = rxFlowable<String> {
send("Hello")
delay(1000)
send("World")
}
这个函数 returns Flowable
的一个实例,它是专门为 Java 的易用性而设计的,例如,你可以在 Java :
exampleFlowable().subscribe(t -> System.out.print(t));
作为开发新 API 的一部分,我正在学习使用 Kotlin。最初我希望 Kotlin API 在 Java (Android) 项目中使用,但从长远来看,我希望完全采用 Kotlin。
作为改进长期 运行 流程实施的一部分,我想使用协程。具体来说,来自 kotlinx.coroutines
包的 channel producer。
例如:
fun exampleProducer() = produce {
send("Hello")
delay(1000)
send("World")
}
在 Java 中最好的消费方式是什么?我可以向 Kotlin and/or Java.
添加临时 'helper' 函数目前,假设使用 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
与 Java 互操作频道的最简单方法是通过 Reactive Streams。 Rx 和 Project Reactor 都是开箱即用的。例如,将 kotlinx-coroutines-rx2
添加到您的依赖关系中,您将能够使用 rxFlowable
builder:
fun exampleFlowable() = rxFlowable<String> {
send("Hello")
delay(1000)
send("World")
}
这个函数 returns Flowable
的一个实例,它是专门为 Java 的易用性而设计的,例如,你可以在 Java :
exampleFlowable().subscribe(t -> System.out.print(t));