我找到了一种简化方法,而不是使用两个flatmap和filter

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时,subscribe只调用,上面的代码是正确的,但是我想找到一种使它更简单的方法;我尝试使用concat,但是我不知道为什么我不能使用它。

最佳答案

您可以通过多种方式来实现。选择simpler解决方案是基于意见的,并且取决于您如何处理ab 发出的项目。尽管在测试Observable.just时,后者可能并不那么明显,但是当涉及到更复杂的Observables时,您可以看到其中的区别。

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

对我来说,更干净的解决方案是对它们进行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的期望不同)

关于kotlin - 哪个RxJava运算符使其更简单,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61054321/

10-12 00:29