Observable
不幸的是,那篇文章中的说法是不正确的,并且在和之间不可能有真正的双射Future
。事情是Observable
更强大的抽象,可以表示无法表示的事物Future
。例如,Observable
实际上可能表示一个无限序列。例如参见Observable.interval
。显然没有办法用Future
. 那篇文章中使用的Observable.toList
调用明确提到:
返回Single
发出单个项目的 a ,由有限源发出的所有项目组成的列表ObservableSource
。
后来它说:
无限且永远不会完成的源将永远不会通过此运算符发出任何内容,并且无限源可能会导致致命的 OutOfMemoryError。
即使你把自己限制在有限Observable
的 s 上,仍然Future
不能完全表达 s 的语义Observable
。考虑Observable.intervalRange
在某个时间段内一个一个地生成一个有限的范围。随着Observable
第一个事件的到来initialDelay
,然后你得到每个事件period
。使用Future
您只能获得一个事件,并且必须仅在序列完全生成时才能Observable
完成。这意味着通过转变Observable[A]
为Future[List[A]]
您立即打破了反应性的主要好处Observable
:您不能一个接一个地处理事件,您必须将它们全部处理成一堆。
总结文章第一段的主张:
在两者之间进行转换,而不会失去它们的异步和事件驱动性质。
是错误的,因为转换Observable[A]
->Future[List[A]]
完全失去了“事件驱动的性质”,Observable
并且没有办法解决这个问题。
PS 实际上,Future
没有那么强大的事实不Observable
应该是一个大惊喜。如果不是,为什么有人会Observable
首先创造?