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