Rx java 将RxJava可观测转换为RxScala可观测

Rx java 将RxJava可观测转换为RxScala可观测,rx-java,rx-scala,rx-javafx,Rx Java,Rx Scala,Rx Javafx,我正在用Scala编写一个小型JavaFx应用程序,我喜欢使用RxScala和RxJavaFx。通过以下代码,我得到了一个可观察的RxJava: JavaFxObservable.fromObservableValue(textfield.textProperty()) 显然,当我在Scala中编写时,我希望有一个RxScala可观察的。现在我发现,我要么导入隐式转换类JavaConversions.\uu要么直接调用toscalabovable。但是,第一个选项对我来说不合适,第二个选项看起

我正在用Scala编写一个小型JavaFx应用程序,我喜欢使用RxScala和RxJavaFx。通过以下代码,我得到了一个可观察的RxJava

JavaFxObservable.fromObservableValue(textfield.textProperty())
显然,当我在Scala中编写时,我希望有一个RxScala
可观察的
。现在我发现,我要么导入隐式转换类
JavaConversions.\uu
要么直接调用
toscalabovable
。但是,第一个选项对我来说不合适,第二个选项看起来有点难看:

选项1:

import rx.lang.scala.JavaConversions._
JavaFxObservable.fromObservableValue(textfield.textProperty())
  .map(s => /* do something */)
import rx.lang.scala.JavaConversions._
toScalaObservable(JavaFxObservable.fromObservableValue(textfield.textProperty()))
  .map(s => /* do something */)
这不起作用,因为RxJava还提供了一个
map
操作符,尽管从技术上讲,参数的类型是不同的

选项2:

import rx.lang.scala.JavaConversions._
JavaFxObservable.fromObservableValue(textfield.textProperty())
  .map(s => /* do something */)
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
,并隐式地为您进行转换(如果您幸运的话!)。通过谷歌搜索这两个选项,很明显大多数人更喜欢使用
asScala
关键字从
JavaConverters
进行更显式的隐式转换

问题2:RxScala是否有类似的
JavaConverters
结构?这将使上述代码更加清晰,我想说:

import rx.lang.scala.JavaConverters._ // this class doesn't exist!
JavaFxObservable.fromObservableValue(textfield.textProperty())
  .asScala
  .map(s => /* do something */)

我将按照以下方式编写您的示例:

导入rx.lang.scala.JavaConversions_
val texts:Observable[String]=JavaFxObservable.FromObservalEvalue(textfield.textProperty())
text.map(s=>/*做点什么*/)
其中,
Observable[String]
是Scala可观测的。 为val
文本提供显式类型可确保隐式转换生效

为什么没有协会

这将需要另一个隐式包装器类(让我们调用
PreScalaObservable
),其中只有一个方法名为
toScala
,因此当您编写
myjavaobbservable.toScala
时,编译器会将其转换为类似于
toprescalobservable(myjavaobbservable.toScala

拥有两个包装器类会有点混乱。或者,如果您非常聪明,您可以将
asScala
方法放入Scala Observable中,并实现它,就像返回
this
一样,因为Java Observable没有名为
asScala
的方法,
myJavaObservable.toScala
可以工作。但是,对于初学者来说,这可能非常复杂


但是如果你有一个更好的想法,或者知道如何简单地表达,我鼓励你在;该项目仍处于0.x版本,没有任何东西是一成不变的…;-)

为什么需要将RXJava格式转换为RXScala?RXScala具有与RXJava相同的所有特性。 比如说

邮编:

合并:

  @Test def merge(): Unit = {
    addHeader("Observable merge")
    Observable.just("hello")
      .merge(Observable.just(" scala"))
      .merge(Observable.just(" world!"))
      .reduce((s, s1) => s.concat(s1))
      .map(s => s.toUpperCase).subscribe(s => println(s))
  }
平面图:

  @Test def flatMap(): Unit = {
    addHeader("Flat Map")
    val text = "number mutated in flatMap::"
    val list = getList
    Observable.from(list)
      .flatMap(n => Observable.just(n) //--> New pipeline
        .map(n => text.concat(String.valueOf(n))))
      .map(s => s.toUpperCase())
      .subscribe(s => println(s))
  }
老实说,我会从头开始。
如果您想查看更多操作员示例,这个问题是RxScala项目的起点

原始问题中提出的语法可以通过导入
rx.lang.scala.JavaConverters
来使用

import rx.lang.scala.JavaConverters._
JavaFxObservable.fromObservableValue(textfield.textProperty())
  .asScala
  .map(s => /* do something */)
同样,Scala
Observable
也可以使用
asJava
转换为Java
Observable


另请参见预期用途。

老实说,我非常喜欢所有操作员的链接。这是RXAPI的定义功能之一(就像Scala Collections API一样)。必须引入额外的
val
s(包括显式键入)并不是我特别喜欢在Scala中做和看到的事情。这是一个有效的技巧,但这是肯定的!我将深入研究这一点,并肯定地考虑将这一讨论转移到RXSCALA问题上。我想我自己也可以在那里做一个拉请求。让我们继续努力吧!我真的不明白你的意思!您是否在争论“如果RxScala具有与RxJava相同的所有功能,为什么会有RxScala?”?我询问如何在RxJava和RxScala之间转换的原因是,从2.11开始,Java的lambda表达式与Scala的lambda不匹配,并且在代码中保持一致性(在应用程序中随处使用RxScala)也是一件好事。也许你可以用“为什么转换”和“从头开始”来解释更多你想说的内容。也许我不理解你,你使用JavaConverter是因为没有办法用RXScala做与JavaFxObservable相同的事情吗?。我的意思是,使用RXScala,您可以做与使用RxJava完全相同的事情,因此不需要从JavaAh移植任何代码,这就是您的意思。实际上,在本例中,我是通过RxJavaFx来讨论这个问题的,它将JavaFx UI事件包装在一个
可观察的
(它本身非常有用!),但我想到的是一个通用API,它为我提供了一个RxJava
可观察的
,需要转换成一个RxScala
可观察的
。我完全承认RxScala本身是RxJava库中Scala的包装器,但是如果您使用Scala编写,它有一些东西可以更好地与RxScala配合使用。例如,我之前提到的lambda的差异。。。