2017-11-10 6 views
2

新しいAPIの開発の一環として、私はKotlinを使うことを学んでいます。当初はKotlin APIをJava(Android)プロジェクト内で使用したいと思っていましたが、長期的にはKotlinを完全に採用したいと考えています。JavaでKotlinチャネルプロデューサを簡単に使用するには?

長期実行プロセスの実装の改善の一環として、私はコルーチンを使用したいと思います。具体的には、kotlinx.courtinesパッケージのchannel producerです。例えば

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

Javaでこれを消費するための最良の方法は何ですか?私はKotlinやJavaに一時的な「ヘルパー」機能を追加することで大丈夫です。

答えて

2

Javaでチャネルを相互運用する最も簡単な方法は、リアクティブストリームを経由する方法です。 RxとProject Reactorの両方がすぐにサポートされています。たとえば、あなたのdependiciesにkotlinx-coroutines-rx2を追加し、rxFlowableビルダーを使用することができます:

fun exampleFlowable() = rxFlowable<String> { 
    send("Hello") 
    delay(1000) 
    send("World") 
} 

この機能は、特に、たとえば、使いやすさJavaからのために設計された、Flowableのインスタンスを返し、あなたはJavaで行うことができます:

exampleFlowable().subscribe(t -> System.out.print(t)); 
+0

私の場合は 'rxObservable'を使用することにしましたが(私は背圧は期待していません)、完全に動作します。 –

0

現在、Java 8が使用され、ラムダが利用可能であると仮定すると、コールバックを渡して受信結果を消費することを許可するヘルパー関数をKotlinに依存します。

Kotlinにおけるヘルパーメソッド:return Unit.INSTANCEcan be found in this answer必要な理由について

ApiKt.exampleProducerCallback(text -> { 
    System.out.print(text); 
    return Unit.INSTANCE; // Needed since there is no void in Kotlin. 
}); 

説明:

fun exampleProducerCallback(callback: (String) -> Unit) = runBlocking { 
    exampleProducer().consumeEach { callback(it) } 
} 

。これは、その後のようにJavaで消費されています。

+0

私は全く新しいKotlinです。これが慣用かどうかはわかりません。私は今現在私がどこにいるのかを知らせるために私の現在のソリューションを投稿しただけです。おそらく、より良い選択肢がありますか? –

+1

明白な改良点は、 'callback:Consumer 'を代わりに使用していることです。 –

関連する問題