2

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

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

例如:

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

在 Java 中使用它的最佳方法是什么?我可以向 Kotlin 和/或 Java 添加临时的“帮助”函数。

4

2 回答 2

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));
于 2017-11-11T10:32:33.203 回答
1

目前,假设使用 Java 8 并且 lambdas 可用,我依赖 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需要的解释可以在这个答案中找到

于 2017-11-10T17:43:37.057 回答