看起来你正在寻找Zip操作符。
有几种不同的使用方法,让我们看一个例子。假设我们有一些不同类型的简单observable:
Observable<Integer> obs1 = Observable.just(1)
Observable<String> obs2 = Observable.just("Blah")
Observable<Boolean> obs3 = Observable.just(true)
等待它们全部完成的最简单方法可能是这样:
Observable.zip(obs1, obs2, obs3, (Integer i, String s, Boolean b) -> i + " " + s + " " + b)
.subscribe(str -> System.out.println(str));
请注意,在zip函数中,参数具有与被压缩的可观察对象的类型相对应的具体类型。
还可以直接对可观察对象列表进行压缩:
List<Observable<?>> obsList = Arrays.asList(obs1, obs2, obs3);
Observable.zip(obsList, (i) -> i[0] + " " + i[1] + " " + i[2])
.subscribe(str -> System.out.println(str));
...或通过将列表包装为一个 Observable<Observable<?>>
:
Observable<Observable<?>> obsObs = Observable.from(obsList);
Observable.zip(obsObs, (i) -> i[0] + " " + i[1] + " " + i[2])
.subscribe(str -> System.out.println(str));
不过,在这两种情况下,由于列表中观察对象的类型和数量未知,因此zip函数只能接受一个Object[]
参数。这意味着zip函数必须检查参数数量并相应地进行转换。
无论如何,以上所有示例最终都会打印出1 Blah true
编辑:在使用Zip时,请确保被压缩的Observables
发出相同数量的项。在上面的示例中,所有三个观察对象都发出了单个项目。如果我们将它们更改为以下内容:
Observable<Integer> obs1 = Observable.from(new Integer[]{1,2,3}); //Emits three items
Observable<String> obs2 = Observable.from(new String[]{"Blah","Hello"}); //Emits two items
Observable<Boolean> obs3 = Observable.from(new Boolean[]{true,true}); //Emits two items
那么1,Blah,True
和2,Hello,True
将是传递到zip函数的唯一项目。由于其他可观测对象已经完成,因此3
项永远不会被压缩。
zip
在其中一个任务完成时就会通知其完成,因此不适用。 - user3707125new Func1<Observable<Boolean>, Observable<Boolean>>()
,第二个lambda表达式替换为new Func1<List<Boolean>, Boolean>()
即可。 - MyDogTom