我正在使用 RxAndroid 2.0.1 和 RxJava 2.0.6。
我有两个可观察对象:一个返回 Maybe<MyObject>
基于一些字符串(ID)。当返回可选对象时,我必须调用第二个接受 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
- 我不能,因为在第一个 Observable 返回 MyObject 之前无法订阅第二个 Observable尝试使用
filter
- 现在的问题是我需要使用阻塞 get 来调用第二个可观察对象。它可能会工作,但看起来像代码味道:objectDAO.getById(objectId) .filter(myObject -> otherDAO.checkCondition(myObject).blockingGet() ) .subscribe( myObject -> checkCondition(myObject), throwable -> /* Fallback */, () -> /* Fallback */ );
尝试使用
flatMap
- 第二个可观察对象返回 boolean 值,而我需要返回原始对象。因此,我需要使用blockingGet
映射代码 fragment 并返回原始对象或Maybe.empty()
有什么建议可以让代码“干净”(它更小而且仍然清楚内部发生了什么)吗?
最佳答案
你可以做的一件事:
objectDAO.getById(objectId)
.flatMapSingle(myObject -> otherDAO
.checkCondition(myObject)
.map(isTrue -> Pair.create(myObject, isTrue))
)
然后你有一个Observable<Pair<MyObject, Boolean>>
并可以随心所欲地继续:subscribe
直接检查Boolean
那里,filter
通过 boolean 值等。
关于java - 使用其他 Observable 过滤 RxJava Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42951869/