如何使用rx将多个单个结果连接到一个带有分组结果的单个结果?

时间:2018-10-15 15:21:20

标签: rx-java2

似乎应该是一件简单的事情,但我暂时无法找到解决方案。因此,我有一些Single源返回不同的对象,并且我希望获得具有分组结果的Single。

查看示例:

val singleA = Single.just(true) 
val singleB = Single.just(20) 
val singleC = Single.just("text")

val singleABC = Single.groupSingles(singleA,singleB,singleC)
singleABC.subscribe { resultA: Boolean, resultB:Int, resultC:String ->  //do something  }

实际上,所有执行长期操作的单打(A,B和C),我都不想一一称呼它们,而是并行。

类似于Observable.combineLatest(),但结果单一

2 个答案:

答案 0 :(得分:0)

Single.zip()个运算符-您可以将多个Single来源合并为一个。

如果该运营商不满足您的要求,则可以为每个Single来源调用Single.toObservable()并使用Observable.combineLatest()

答案 1 :(得分:0)

您要查找的是zip运算符。 zip可用于关联多个来源的排放,并具有以下区别:仅当每个每个其基础排放时才排放。所以...

  • 如果有两个来源,则zip将在两个来源都发出时发出两个值。
  • 如果有三个来源,则zip将在所有三个来源都发出时发出三个值。
  • 如果有四个来源,则zip将在所有四个来源都发出时发出四个值。
  • ...等
  • 如果任何来源发出错误,onError将在下游触发

在了解了这一点之后,您可以在这种情况下使用zip

val singleA = Single.just(true)
val singleB = Single.just(20)
val singleC = Single.just("text")

val singleABC =
    Single.zip(
        singleA,
        singleB,
        singleC,
        Function3 { resultA: Boolean, resultB: Int, resultC: String ->
          // do something
        }
    )

(回头看,您实际上距离很近)

我发现RxMarbles页是获取有关不同操作员工作方式的动手视觉视角的有用资源。我鼓励您在那儿玩一会儿,以使您对任何您不太了解的事物有一种感觉,并发现一些您不知道的事物。 (在显示所有运算符时并不详尽,但是涵盖了很多常见的运算符。)