哪个RxJava运算符可以使它更简单



我找到了一种方法,使其更简单,而不是使用两个flatmap和过滤器

val a = Observable.just(false)
val b = Observable.just(true)
val x = Observable.just(Unit)
x.flatMap { a }
.filter { !it }
.flatMap { b }
.filter { it }
.subscribe {
// a must be false and b must be true
}

我想过滤,所以订阅只在a为false,b为true时调用,上面的代码是正确的,但我想找到一种方法让它更简单;我试着使用concat,但我不知道为什么我不能使用它…

有多种方法可以实现这一点。选择simpler解决方案是基于意见的,取决于如何处理ab发出的项。当测试Observable.just时,后一种可能不那么明显,但当涉及到更复杂的Observables时,你可以看到差异。

在您的示例中,只有当a具有正确的值时,才会订阅b。这是故意的吗

对我来说,更干净的解决方案是zip它们,并将内容"放在一起"进行比较。但在可能发出项目之前,这需要来自两个Observable的项目。

Observable.zip(a, b, BiFunction { a, b -> Pair(a, b) })
.filter { !it.first && it.second }
.subscribe {
// a must be false and b must be true     
}

编辑:

为了给您一个不同方法的例子,这里有一个没有filter的例子:

Observable.zip(a.takeWhile { !it }, b.takeWhile { it }, BiFunction { _, _ -> Unit })
.subscribe {
// a must be false and b must be true
}

(请记住,他们对ab都有不同的期望(

最新更新