簡體   English   中英

用其他 Observable 過濾 RxJava Observable

[英]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 */
    );
}

現在我想知道如何簡化我的代碼。 我的想法:

  1. 嘗試使用zip - 我不能,因為在第一個返回 MyObject 之前無法訂閱第二個 Observable

  2. 嘗試使用filter - 現在的問題是我需要使用阻塞 get 來調用第二個 observable。 它可能會工作,但看起來像代碼氣味:

     objectDAO.getById(objectId) .filter(myObject -> otherDAO.checkCondition(myObject).blockingGet() ) .subscribe( myObject -> checkCondition(myObject), throwable -> /* Fallback */, () -> /* Fallback */ );
  3. 嘗試使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM