2017-03-22 100 views
4

我使用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 */ 
    ); 
} 

現在我想知道我怎麼能簡化我的代碼。我的想法:

  1. 嘗試使用zip - 我不能因爲第二個可觀測無法進行訂閱直到第一個返回MyObject的

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

    objectDAO.getById(objectId) 
        .filter(myObject -> 
        otherDAO.checkCondition(myObject).blockingGet() 
    ) 
        .subscribe(
         myObject -> checkCondition(myObject), 
         throwable -> /* Fallback */, 
        () -> /* Fallback */ 
    ); 
    
  3. 嘗試使用flatMap - 第二個觀察到的回報布爾而我需要返回原來的對象。正因爲如此,我需要梅普的代碼片段與blockingGet,並返回原來的對象或Maybe.empty()

任何建議,如何做到這一點這樣的代碼是「乾淨」(它的體積更小,它仍然清楚什麼發生在裏面)?

+0

'objectDAO.getById(objectId).flatMap(myObject - > otherDAO.checkCondition(myObject).map(isTrue - > Pair.create(myObject,isTrue))' - 那麼你有一個'Observable >'然後你可以繼續:直接訂閱,在那裏檢查'Boolean',用'Boolean'值檢查'filter'等 –

+0

@ david.mihola它和我的第三種方法類似,只不過現在我已經意識到了我不需要使用阻止獲取。所以寧可返回'Pair LR89

+0

此外,它似乎我不能使用'objectDAO.flatMap(otherDao.map())'組合,當我將它改爲'objectDAO.map(otherDao.map())',那麼結果是'Single >>'這也不是很好 – LR89

回答

3

有一兩件事你可以做:

objectDAO.getById(objectId) 
    .flatMapSingle(myObject -> otherDAO 
     .checkCondition(myObject) 
     .map(isTrue -> Pair.create(myObject, isTrue)) 
    ) 

那麼你有一個Observable<Pair<MyObject, Boolean>>但是並可以進行你想要的:subscribe直接和布爾值檢查Boolean那裏,filter

0

RxJava2Extensions akarnokd的額外項目有一個filterAsync變壓器(與compose一起使用)就是這樣做的,使用任何Publisher<Boolean>;)

相關問題