嵌套 zip 导致 Observable 的 return 值不合适

Nested zip's causing return value of Observable to misfit

我是反应式编程的新手,这个方法无法编译,我无法正确使用,

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;
    });
}

出于某种原因,内部 return .zip return Observable 而不是 Observable - 这会导致编译错误...

如果我从内部 .zip 中删除 'return' 然后它编译。

zip 需要一个 return 和 Object 的 lambda,在你的例子中是 Data,这就是你在 SINGLE 中所做的案例.

TOURNAMENT 你 return 一个 Observable 不是 Data 对象。

根据您的情况,如果您想要 return 一个 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();

否则,您可以 return 而不是 Data 对象 Observable<Data>。在这种情况下,只需将您的 SINGLE 案例更改为 return 一个 Observable,它将仅发出您的 Data 对象。

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