【问题标题】:Nested zip's causing return value of Observable to misfit嵌套 zip 导致 Observable 的返回值不合适
【发布时间】:2015-04-03 12:33:25
【问题描述】:

我是响应式编程的新手,并且有这种无法编译的方法,我无法正确使用,

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 中删除“返回”,那么它会编译。

【问题讨论】:

    标签: java system.reactive rx-java


    【解决方案1】:

    zip 需要一个返回 Object 的 lambda,在你的情况下是 Data,这就是你在 SINGLE 情况下所做的。

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

    根据您的情况,如果您想返回 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();
    

    否则,您可以返回 Observable&lt;Data&gt; 来代替 Data 对象。在这种情况下,只需更改您的 SINGLE 案例以返回一个 Observable ,它只会发出您的 Data 对象。

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

    【讨论】:

    • 使用 .toBlocking 方法是否会影响我的异步流程或导致阻塞线程等性能问题?
    • 是的。正如它的名字:toBlocking 块。正如您评论的那样,您可以尝试第二种解决方案,即返回 Observable&lt;Data&gt; 而不是 Data
    • 是的。 Observable.zip(...).flatMap(obs -&gt; obs)
    • 我尝试添加: Observable.zip(...).flatMap(obs -> { return obs; });但它没有解决问题 - 它仍然没有编译相同的错误。 Error = "类型不匹配:无法从 Data 转换为 Observable extends Object>"
    • 你嵌套的zip是否只能返回新的Data?难道你没有一行返回其他东西,迫使编译器将返回类型推断为Object
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2015-11-06
    • 2017-03-24
    • 1970-01-01
    相关资源
    最近更新 更多