私は Scala で小さな JavaFx アプリケーションを作成しており、これには RxScala と RxJavaFx を使用するのが好きです。次のコードでRxJava Observable
を取得します。
JavaFxObservable.fromObservableValue(textfield.textProperty())
明らかに、私は Scala で書いているので、代わりにRxScala Observable
を使いたいと思っています。今、この投稿JavaConversions._
を見つけました。暗黙の変換クラスをインポートするか、直接呼び出す必要があると言っていますtoScalaObservable
。ただし、最初のオプションではうまくいきません。2 番目のオプションは見栄えが悪くなります。
オプション1:
import rx.lang.scala.JavaConversions._
JavaFxObservable.fromObservableValue(textfield.textProperty())
.map(s => /* do something */)
map
引数の型は技術的には異なりますが、RxJava も演算子を提供するため、これは機能しません。
オプション 2:
import rx.lang.scala.JavaConversions._
toScalaObservable(JavaFxObservable.fromObservableValue(textfield.textProperty()))
.map(s => /* do something */)
これは機能しますが、正直なところ、これは本当にひどいものに見えます!
質問 1:何かが足りないのでしょうか、それとも本当にこの 2 つの選択肢しかないのでしょうか?
つまり、Java の標準コレクションから Scala のコレクション (およびその逆) に変換するには、2 つのオプションがあります:JavaConverters
とJavaConversions
. 前者はキーワードasJava
/を導入しasScala
ますが、後者は一種の同等のものでrx.lang.scala.JavaConversions
あり、暗黙的に変換を行います (運が良ければ!)。これら 2 つの設定をグーグルで調べると、ほとんどの人がキーワードをJavaConverters
使用したより明示的な暗黙の変換を好むことは明らかです。asScala
質問 2:JavaConverters
RxScalaのような類似の構造はありますか? これにより、上記のコードがよりクリーンになります。
import rx.lang.scala.JavaConverters._ // this class doesn't exist!
JavaFxObservable.fromObservableValue(textfield.textProperty())
.asScala
.map(s => /* do something */)