哪个 RxJava 运算符使它更简单

Which RxJava operator to make it simpler

我找到了一种更简单的方法,而不是使用两个 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 为假且 b 为真时调用订阅,上面的代码是正确的,但我想找到一种方法使其更简单;我尝试使用 concat 但我不知道为什么我不能使用它...

您可以通过多种方式实现这一目标。选择 simpler 解决方案是基于意见的,取决于 您希望如何处理 ab 发出的项目。虽然后者在测试 Observable.just 时可能并不那么明显,但当涉及到更复杂的 Observables 时,您可以看到差异。

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

对我来说,更简洁的解决方案是 zip 它们并比较内容 "together"。但这需要来自两个 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都有不同的期望)