我找到了一种方法,使其更简单,而不是使用两个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
解决方案是基于意见的,取决于如何处理a
和b
发出的项。当测试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
}
(请记住,他们对a
和b
都有不同的期望(