将单个Observable与Observable.from(数组)结合起来

时间:2015-09-02 09:07:12

标签: android rx-java

给出以下输入:

Observable<Class1> obs = {{super complex long method}}
List<Class2> inputList = {{simple list}}

我希望能够创建以下内容:

Observable<Class3> output

发出将方法input.transform(Class1 c)应用于inputList中的每个输入的结果。

到目前为止,我提出的是拉链和拉链的组合。重复:

Observable<Class3> output = Observable.zip(obs.repeat(), Observable.from(inputList), 
                            (class1, class2) -> class2.transform(class1));

然而,重复过于极端,它会在拉链开始之前发出多个重复的项目。

我尝试的另一件事是使用combineLatest,但由于我的List首先发出,所以我最终只将列表的最后一项与class1实例合并。

其他哪些运营商组合可能有意义?

2 个答案:

答案 0 :(得分:1)

您只需更改参数顺序,例如zip(Observable.from(inputList), obs.repeat(), ...)

zip将订阅第一个Observable,然后订阅第二个Observable。在您的示例中,第一个Observable是无限的(例如,obs.repeat()),RxJava最初会请求128个项目。这就是为什么你在订阅第二个obs.repeat()之前看到Observable发出了很多项目。

如果将参数顺序更改为Observable.from(inputList), Observable.from(inputList),RxJava将首先订阅Observable.from(inputList),因为它是同步Observable,RxJava将使用它并立即知道其长度(假设其长度)小于128),然后RxJava将使用此长度从第二个obs.repeat()请求项目。所以它不需要超过必要的项目。

答案 1 :(得分:1)

听起来你想要做的是从obs获取每个输入,将列表中定义的一组函数应用于obs中的每个项目,然后将该输出展平回来进入Class3类型的Observable。在这种情况下,我认为flatMap是一个不错的选择,因为它清楚地表明了意图:每个输入项应用许多函数,然后展平流。

这是一个例子(原谅Java6-ness):

Observable<Class3> output = obs.flatMap(new Func1<Class1, Observable<Class3>>() {
    @Override
    public Observable<Class3> call(final Class1 class1) {
        return Observable.from(inputList).map(new Func1<Class2, Class3>() {
            @Override
            public Class3 call(Class2 class2) {
                return class2.transform(class1);
            }
        });
    }
});