[英]Filter RxJava Observable with other Observable
我使用 RxAndroid 2.0.1 和 RxJava 2.0.6。
我有两个可观察对象:一个基于某个字符串(ID)返回Maybe<MyObject>
。 当返回可选对象时,我必须调用第二个接受 MyObject 实例并在对象满足某些条件时返回Single<Boolean>
对象。 然后我可以对对象实例做一些进一步的操作。
我目前的实现如下:
objectDAO.getById(objectId)
.subscribe(
myObject -> checkCondition(myObject),
throwable -> /* Fallback */,
() -> /* Fallback */
);
private void checkCondition(final MyObject myObject) {
otherDAO.checkCondition(myObject)
.subscribe(
isTrue -> {
if (isTrue) {
// yay! now I can do what I need with myObject instance
} else {
/* Fallback */
}
},
throwable -> /* Fallback */
);
}
现在我想知道如何简化我的代码。 我的想法:
尝试使用zip
- 我不能,因为在第一个返回 MyObject 之前无法订阅第二个 Observable
尝试使用filter
- 现在的问题是我需要使用阻塞 get 来调用第二个 observable。 它可能会工作,但看起来像代码气味:
objectDAO.getById(objectId) .filter(myObject -> otherDAO.checkCondition(myObject).blockingGet() ) .subscribe( myObject -> checkCondition(myObject), throwable -> /* Fallback */, () -> /* Fallback */ );
尝试使用flatMap
- 第二个 observable 返回布尔值,而我需要返回原始对象。 因为我需要梅普的代码片段与blockingGet
并返回原来的对象或Maybe.empty()
任何建议如何以代码“干净”的方式进行操作(它更小并且仍然清楚内部发生了什么)?
你可以做的一件事:
objectDAO.getById(objectId)
.flatMapSingle(myObject -> otherDAO
.checkCondition(myObject)
.map(isTrue -> Pair.create(myObject, isTrue))
)
然后你有一个Observable<Pair<MyObject, Boolean>>
以及但是可以进行你想要的: subscribe
直接检查Boolean
那里, filter
由布尔值,等等。
akarnokd 的 RxJava2Extensions额外项目有一个filterAsync
转换器(与compose
一起使用),它使用 any Publisher<Boolean>
;)
我想出了解决方案,而没有传递带有布尔值的 Pairs,以防有人遇到同样的问题。 例如,如果objectDAO.getById(objectId)
返回Observable<T>
并且otherDAO.checkCondition(myObject)
返回Single<Boolean>
,我们可以这样处理过滤:
objectDAO.getById(objectId)
.flatMap(myObject -> otherDAO
.checkCondition(myObject)
.toObservable()
.filter(Boolean::booleanValue)
.map(o -> myObject))
.flatMapSingle(obj -> ...)
不需要的对象将被解析为Observable.empty
并因此被过滤,这样只有需要的对象才会到达.flatMapSingle(obj -> ...)
基本上,同样的事情可以通过稍微更容易理解的结构来实现(不过,我发现第一个在美学上更好一些):
objectDAO.getById(objectId)
.flatMap(myObject -> otherDAO
.checkCondition(myObject)
.flatMapObservable(isChecked -> isChecked ? Observable.just(myObject) : Observable.empty()))
.flatMapSingle(obj -> ...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.