2015-04-03 64 views
1

我是很新,反應式編程,並有這樣的方法,它不會編譯,我無法得到它的權利,嵌套壓縮的造成的可觀回報價值錯配

public Observable<Data> findData(long templateId) { 
    .. 
    .. 

    return Observable.zip(templateObs, dataObs, (templateObj, dataObj) -> { 

     try { 

      switch(model) { 

       case SINGLE: { 
         .. 
         .. 

         return new Data(); 
       } 


       case TOURNAMENT: { 

         // compilation error on the entire .zip block : 
         // Type mismatch: cannot convert from Observable<Object> to Observable<Data> 

         return Observable.zip(obs1, obs2, obs3, obs4, (data, data2, data3, data4) -> { 
          .. 
          .. 

          return new Data(data1,data2,data3,data4); 
         }).flatMap(results -> results); 
       } 
      } 

     }catch(DataException e) { 
      log.error(e); 
     } 

     return null; 
    }); 
} 

出於某種原因,內部返回.zip返回Observable而不是Observable - 這會導致編譯錯誤...

如果我從內部.zip中刪除'return',那麼它會編譯。

回答

1

zip需要一個返回Object的lambda,在你的情況下是Data,這就是你在SINGLE的情況下所做的。

TOURNAMENT您返回一個Observable不是Data對象。

根據您的情況,如果您想要返回Data,則必須使用toBlocking方法阻止您的嵌套zip運算符。

case TOURNAMENT: 
     return Observable.zip(obs1, obs2, obs3, obs4, 
          (data, data2, data3, data4) -> 
            { return new Data(data1,data2,data3,data4); } 
          ).toBlocking().single(); 

否則,您可以返回,而不是一個Data對象的Observable<Data>。在這種情況下,只需更改您的SINGLE箱子即可返回Observable,該箱子只會發出您的Data物件。

case SINGLE: return Observable.just(new Data()); 
+0

通過使用.toBlocking方法它會影響我的異步流程或像阻塞線程的原因和性能問題? – Shvalb 2015-04-03 13:59:03

+0

yeap。因爲它被命名爲'toBlocking'塊。當你評論時,你可以嘗試第二個解決方案,它將返回'Observable '而不是'Data'。 – dwursteisen 2015-04-03 14:15:20

+0

我必須返回數據...也許我可以.flatMap結果莫名其妙.. – Shvalb 2015-04-03 14:37:03