在Scala中将Rx-Observable转换为Twitter Futures

时间:2018-01-10 17:27:43

标签: scala rx-java rx-scala

我想以最重新激活的方式实现以下功能。我需要这些来实现所述类型之间自动转换的双射。

indexPath

我在相关主题上发表了this文章,但我无法使其发挥作用。

1 个答案:

答案 0 :(得分:2)

不幸的是,该文章中的声明不正确,ObservableFuture之类的内容之间不存在真正的双重投放。问题是Observable是更强大的抽象,可以表示Future无法表示的事物。例如,Observable实际上可能代表无限序列。例如,请参阅Observable.interval。显然,没有办法用Future表示这样的东西。该文中使用的Observable.toList调用明确提到:

  

返回发出单个项目的Single,该列表由 有限 ObservableSource发出的所有项组成。

后来它说:

  

无限且永不完整的源将永远不会通过此运算符发出任何内容,并且无限的源可能会导致致命的OutOfMemoryError。

即使您将自己仅限于有限Observable s,仍然Future无法完全表达Observable的语义。考虑在某段时间内逐个生成有限范围的Observable.intervalRange。使用Observable,第一个事件发生在initialDelay之后,然后每个period获得一个事件。使用Future,您只能获得一个事件,并且必须仅在序列完全生成时才完成Observable。这意味着通过将Observable[A]转换为Future[List[A]],您可以立即打破Observable的主要好处 - 反应性:您无法逐个处理事件,您必须在一个处理它们束。

总结本文第一段的主张:

  

在两者之间进行转换,而不会失去它们的异步和事件驱动性质。

为false,因为转化为Observable[A] - > Future[List[A]]完全失去了Observable的“事件驱动的本质”,并且没有办法解决这个问题。

P.S。实际上Future不如Observable强大的事实不应该是一个大惊喜。如果不是,为什么有人会在第一时间创建Observable