[英]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.