我正在用 Scala 编写一个小型 JavaFx 应用程序,我喜欢为此使用 RxScala 和 RxJavaFx。使用以下代码,我得到一个RxJava Observable
:
JavaFxObservable.fromObservableValue(textfield.textProperty())
显然,当我使用 Scala 编写代码时,我希望使用RxScala Observable
来代替。现在我找到了这个帖子,说我要么要导入隐式转换类,JavaConversions._
要么直接调用toScalaObservable
。但是,第一个选项不适合我,第二个选项看起来有点难看:
选项1:
import rx.lang.scala.JavaConversions._
JavaFxObservable.fromObservableValue(textfield.textProperty())
.map(s => /* do something */)
这不起作用,因为 RxJava 也提供了一个map
运算符,尽管参数的类型在技术上是不同的。
选项 2:
import rx.lang.scala.JavaConversions._
toScalaObservable(JavaFxObservable.fromObservableValue(textfield.textProperty()))
.map(s => /* do something */)
这行得通,但老实说,这看起来真的很可怕!
问题 1:我是否遗漏了什么,或者这些真的是仅有的两个选择吗?
我的意思是,要将 Java 的标准集合转换为 Scala 的集合(反之亦然),您有两个选择:JavaConverters
和JavaConversions
. 前者引入了关键字asJava
/ asScala
,而后者相当于rx.lang.scala.JavaConversions
隐式地为您进行转换(如果您幸运的话!)。谷歌搜索这两者的偏好,很明显,大多数人更喜欢更显式的隐式转换 from JavaConverters
withasScala
关键字进行更显式的隐式转换。
问题 2:是否有类似JavaConverters
RxScala 的构造?这将使上面的代码更加简洁,我想说:
import rx.lang.scala.JavaConverters._ // this class doesn't exist!
JavaFxObservable.fromObservableValue(textfield.textProperty())
.asScala
.map(s => /* do something */)