我在Scala中编写了一个小型的JavaFx应用程序,我喜欢使用RxScala和RxJavaFx。用下面的代码,我收到了RxJavaObservable
:将RxJava Observable转换为RxScala Observable
JavaFxObservable.fromObservableValue(textfield.textProperty())
显然,正如我在斯卡拉写,我想有一个RxScalaObservable
来代替。现在我找到了this post,说我要么直接导入隐式转换类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
,并为您隐式转换(如果您幸运的话!)。谷歌搜索这两个偏好,很显然,大多数人更喜欢JavaConverters
与asScala
关键字更明确的隐式转换。
问题2:有没有类似的结构像JavaConverters
与RxScala?这将使上面这么多清洁的代码,我会说:
import rx.lang.scala.JavaConverters._ // this class doesn't exist!
JavaFxObservable.fromObservableValue(textfield.textProperty())
.asScala
.map(s => /* do something */)
说实话,我真的很喜欢所有运营商的链接。这是Rx API的定义权力之一(与Scala Collections API一样)。不得不引入额外的'val's,包括明确的输入,这并不是我特别喜欢在Scala中看到的东西。这是一个可行的把戏,这是一定的!我会进一步研究这个问题,并且肯定会考虑将这个讨论移到RxScala问题上。我想我可以在那边自己做拉请求。让我们继续坚持下去! – RvanHeest