RxScala "zip" 多个 Observable

RxScala "zip" multiple Observables

在 RxScala 中如何"zip"超过 2 个 Observables?

val ob1: Observable[Int] = Observable.from(Future(10))
val ob2: Observable[Int] = Observable.from(Future(20))
val ob3: Observable[Int] = Observable.from(Future(30))

"zip" 与 2 个 Observables 完美配合

val obComb: Observable[(Int, Int, Int)] = ob1 zip ob2

我们如何"zip"超过 2 个 Observable?

您可以使用 zipWith 来提供 "zipping" 功能。

val obComb = ob1
  .zipWith(ob2)({ case (x1, x2) => (x1, x2) })
  .zipWith(ob3)({ case ((x1, x2), x3) => (x1, x2, x3) })

由于不能将两个以上的 Observable 压缩 "nicely" 定义为实例方法,因此在伴随对象中将其定义为 "static" 方法。也就是说,压缩三个 Observables,你写

val obComb = Observable.zip(ob1, ob2, ob3)

如果你有3个以上的observable,你也可以使用:

val allObs = Observable.from(List(ob1, ob2, ob3))
val zipObs = Observable.zip(allObs)

如果你不喜欢静态方式,也可以试试:

val zipObs = ob1 zip ob2 zip ob3 map {
   case ((a, b), c) => (a, b, c)
}