嵌套的zip导致Observable的返回值错配

时间:2015-04-03 12:33:25

标签: java system.reactive rx-java

我对Reactive编程很新,并且这个方法不能编译,我无法正确编程,

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 个答案:

答案 0 :(得分:1)

zip需要一个返回Object的lambda,在您的情况下为Data,这是您在SINGLE案例中所做的。

TOURNAMENT中,您返回的是一个不是Data对象的Observable。

根据您的情况,如果您想要返回Data,那么您必须使用zip方法阻止嵌套的toBlocking运算符。

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