操作符之concatMap( )与.flatMap( )的比较

来源:互联网 发布:父亲对女儿男朋友 知乎 编辑:程序博客网 时间:2024/05/21 12:03

http://fernandocejas.com/2015/01/11/rxjava-observable-tranformation-concatmap-vs-flatmap/

以上是复制的地址

RxJava观测改造的探讨:concatMap()VS flatMap()

过了一会儿,我决定,是时候找回了一些写作。  正如你可能知道@SoundCloud我们做一个强大的使用被动方式的,但说实话,我不是在这里谈论RxJava本身因为有很大的在那里文章读到它(这里这里)和伟大的人跟随,以及如本Christesen马蒂亚斯卡普勒其他许多人
我也认为自己是一个'新手'的反应式编程,现在我在那个阶段,你开始看到这种方法的优点,并希望使每一个对象的反应,这是非常危险的,所以如果你是在同一水平线上的我,只是保持它的眼睛,并用它无论是有道理的,建议你用。
让我们开始与文章,然后......

观察到的转型

有,你有时间可观察到的,你订阅了,你想改变的结果(请记住,一切都在无编程流)。当涉及到可观察到的转型,从我们所消耗的序列中的值并不总是格式或形状,我们需要或需要任成丰富的对象或成多个值,以扩大每个值,  所以我们可以通过将功能由您可观察返回的每个元件,其将转换所有由它发射到项目执行此观测量和合并的结果。别担心,如果你还不知道(我花了一段时间来思考反应),我们会看到在一个位的例子。

问题

我被从数据库中检索一组值和施加的函数对每个人认为是假设两个转换它们在其它的目的异步并保护它们的顺序。最后一个步骤是将它们转换成由UI来显示结果所需要的列表。我的行为不是预期的一个,这是为什么:我是用Observable.flatMap(),它不会保留元素的顺序。

一个简单的例子

让我把一个简单的例子来演示提到的行为。比方说,我们有一个可观察到的发射是一个整数集,我们要计算每一个值的平方:

在这里,我们的DataManager类有一个返回的方法观测从2到10。然后我们要计算的值,所以这里的平方是我们发出的数字功能应用到他们每个人:

这将需要一个整数作为入门,将产生一个可观察到的<整数>,将它们合并,并发射结果。正如你所看到的,我们使用到呼叫dataManager.squareOf()方法,该方法是异步的(用于演示目的),看起来是这样的:

当然,这工作,但没有达到预期(至少是这样,我想),元素的顺序是不保留(logcat的输出):

flatMap_logcat

观察到flatMap()VS concatMap()

这两种方法看起来几乎一样,但有一个区别:合并最终结果时,操作者的使用下面是官方文档的一些东西:

flatMap

flatMap()方法创建一个新的观测运用您提供由原始发出的每一项功能的观测,如该函数本身是一个可观察的发出物品,然后合并的功能应用到所发出的每一项成果原来的观测,发射这些合并的结果。注意,flatMap()可以交织,从转换由源观测发射的物品导致由观测量发射的项目。如果重要的是这些产品不进行交错,可以改为使用类似concatMap()方法。

concatMap

正如你所看到的,这两个功能都非常相似,细微的差别是输出是如何创建的(应用映射函数后)。 flatMap()使用合并运算符,而concatMap()使用的毗连运算符这意味着最后一个关心该元素的顺序,所以盯紧,如果需要订购:)。

运营商合并

将多个观测量为一体。
合并

毗连运算符

连接两个或更多的观测量顺序。
CONCAT

问题解决了

观察到concatMap()来拯救!这个问题很容易,只需切换到concatMap()方法来解决。我知道你可能会说我为什么不阅读文档第一,这是很好解释的方式(荣誉的RxJava贡献者!),但有时我们是懒惰,或者是我们要寻找到最后的地方。这里是最后的结果和一些测试我做了(你可以找到下面的示例代码)的图片:






final_results_concatMap


个人的小总结:

设计到数组类型的话contatmap顺序执行,flatmap可能顺序不同,单个操作的话,基本上相同


参考

这是我的两分钱,并希望它能帮助。一如往常这里是示例应用程序和其他有用的信息值得阅读的示例代码。

  1. 源代码:https://github.com/android10/Android-ReactiveProgramming
  2. 在Android上RxJava官能团反应性编程
  3. 所著的Grokking RxJava
  4. 7大秘诀RxJava在Android
  5. 掌握观测量
  6. 反应伦敦会议
1 0
原创粉丝点击