给出以下输入:
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实例合并。
其他哪些运营商组合可能有意义?
答案 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);
}
});
}
});