我正在观看关于Observables的讲座https://class.coursera.org/reactive-002/lecture/143。
讲师说map
和Observable
Iterable
的行为相同,但flatMap
行为不同,因为Observable
元素不按顺序排列。
map
的情况不一样吗?
使用map
时为什么没有区别?
答案 0 :(得分:6)
在讲座中讲得很清楚。
Iterable
和Observable
的地图相同,只需使用相同的功能修改每个元素。
List(1, 2, 3) map (_ + 1)
收益List(1, 2, 3)
Observable
上的地图更改顺序是没有意义的,只要源Observable
生成一个值,映射一个会生成一个原始值,但应用了特定的功能。订单保留。
但是flatMap
需要一个函数A => Observable[A]
,因此对于每个元素,它会创建另一个Observable
。
List
的内容可能是
List(1, 10, 100).flatMap(n => List(n + 1, n + 2, n + 3))
应该产生
List(2, 3, 4, 11, 12, 13, 101, 102, 103)
您可以将其视为该函数将产生
List(List(2, 3, 4), List(11, 12, 13), List(101, 102, 103))
然后将它们连接起来(压平列表)。
如果你对Observables
做同样的事情,对于每个元素,你会产生一个异步创建它的Observable
,你不知道它们何时会出现。所以基本上你会有3个Observables:
Observable(2, 3, 4), Observable(11, 12, 13), Observable(101, 102, 103)
当它们合并时,你不知道元素的顺序是什么,你只能确定3将在4之前出现而102将在103之前出现,但不能确定它是以11还是2开始或者101。
这就是flatMap
的{{1}}与Iterables
的工作方式不同的原因。确定Observables
订单时,但对于Iterables
,您无法确定元素的顺序。这正如图所示
其中一个蓝色marbels来到最后一个绿色大理石之前。 Observables
不会出现这种情况,按顺序你会有2个红色,2个绿色和2个蓝色。