我使用RxAndroid 2.0.1和RxJava 2.0.6。與其他Observable過濾RxJava Observable
我有兩個觀察對象:一個根據某個String(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的嘗試使用
filter
- 現在的問題是,我需要使用阻塞來調用第二個observable。它將propably工作,但看起來像一個代碼味道:objectDAO.getById(objectId) .filter(myObject -> otherDAO.checkCondition(myObject).blockingGet() ) .subscribe( myObject -> checkCondition(myObject), throwable -> /* Fallback */, () -> /* Fallback */ );
嘗試使用
flatMap
- 第二個觀察到的回報布爾而我需要返回原來的對象。正因爲如此,我需要梅普的代碼片段與blockingGet
,並返回原來的對象或Maybe.empty()
任何建議,如何做到這一點這樣的代碼是「乾淨」(它的體積更小,它仍然清楚什麼發生在裏面)?
'objectDAO.getById(objectId).flatMap(myObject - > otherDAO.checkCondition(myObject).map(isTrue - > Pair.create(myObject,isTrue))' - 那麼你有一個'Observable >'然後你可以繼續:直接訂閱,在那裏檢查'Boolean',用'Boolean'值檢查'filter'等 –
@ david.mihola它和我的第三種方法類似,只不過現在我已經意識到了我不需要使用阻止獲取。所以寧可返回'Pair
LR89
此外,它似乎我不能使用'objectDAO.flatMap(otherDao.map())'組合,當我將它改爲'objectDAO.map(otherDao.map())',那麼結果是'Single>>'這也不是很好 –
LR89