java - 将 Observable 转为 ObservableValue/Binding/EventStream 的最有效方法?

标签 java javafx reactive-programming rx-java reactfx

我将更频繁地使用 RxJava 和 ReactFX,但我想了解的是如何协调两者,因为 ReactFX 没有 RxJava 依赖项,那么两者如何在同一个 monad 中相互通信?对于在没有大量样板的情况下在 JavaFX 的 ObservableValue、RxJava 的 Observable 和 ReactFX 的 StreamEvent 之间进行桥接的情况尤其如此。

我想用 RxJava 编写我的核心业务逻辑,因为它们并不总是支持 JavaFX 应用程序。但我希望 JavaFX UI 使用 ReactFX 并利用 EventStream。所以我的问题是将 EventStream 转换为 Observable 以及将 Observable 转换为 EventStream 的最有效方法是什么? code>、BindingObservableValue?我知道我可以全面使用 RxJava,但我想利用 ReactFX 的平台线程安全性和便利性......

//DESIRE 1- Turn EventStream into Observable in the same monad
Observable<Foo> obs = EventStream.valuesOf(fooObservableValue).toObservable();

//Desire 2- Turn Observable into ObservableValue, Eventstream, or Binding
Binding<Foo> obsVal = Observable.create(...).toBinding();

最佳答案

将 ReactFX EventStream 转换为 RxJava Observable:

Observable<Foo> toRx(EventStream<Foo> es) {
    PublishSubject<Foo> sub = PublishSubject.create();
    es.subscribe(sub::onNext);
    return sub;
}

将 RxJava Observable 转换为 ReactFX EventStream:

EventStream<Foo> fromRx(Observable<Foo> obs) {
    EventSource<Foo> es = new EventSource<>();
    obs.subscribe(foo -> Platform.runLater(() -> es.push(foo)));
    return es;
}

请注意后一种情况下的Platform.runLater(...)。这使得生成的 EventStream 在 JavaFX 应用程序线程上发出事件。

另请注意,在这两种情况下,我们都会忽略从 subscribe 方法返回的 Subscription。如果您要在应用程序的生命周期内建立绑定(bind),那么这很好。另一方面,如果它们之间的绑定(bind)应该是短暂的,在第一种情况下,您将让您的 RxJava 组件暴露 Subject,您的 ReactFX 组件暴露 EventStream code>,然后根据需要执行订阅/取消订阅。第二种情况也是如此。

关于java - 将 Observable 转为 ObservableValue/Binding/EventStream 的最有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30241292/

相关文章:

r - 如何运行从 eventReactive 内部获取数据并在表中绘制的函数?

java - 如何将两个 Pane 添加到 TitledPane 标题?

JavaFX 如何定位鼠标

java - 检测某个文件夹android中重复文件的最佳方法

java - 在 web.xml 中引用环境变量

java - 运行 ArrayList<checkbox> 时抛出空指针异常

javascript - 可观察异步的 rxJs 回调

java - 我怎样才能使这个 rxjava zip 并行运行?

java - 我可以将 Velocity 模板与 InputStreams 一起使用吗?

java - SpriteBatch.draw libgdx 不显示任何内容