为什么flatMap与Observable和Iterable不同,而map是相同的

时间:2016-03-28 14:47:13

标签: scala

我正在观看关于Observables的讲座https://class.coursera.org/reactive-002/lecture/143

讲师说mapObservable Iterable的行为相同,但flatMap行为不同,因为Observable元素不按顺序排列。

map的情况不一样吗? 使用map时为什么没有区别?

1 个答案:

答案 0 :(得分:6)

在讲座中讲得很清楚。

IterableObservable的地图相同,只需使用相同的功能修改每个元素。

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,您无法确定元素的顺序。这正如图所示

enter image description here

其中一个蓝色marbels来到最后一个绿色大理石之前。 Observables不会出现这种情况,按顺序你会有2个红色,2个绿色和2个蓝色。

相关问题