听起来您正在寻找Zip运算符。
有几种不同的用法,让我们来看一个例子。假设我们有一些不同类型的简单可观察物:
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});
Observable<String> obs2 = Observable.from(new String[]{"Blah","Hello"});
Observable<Boolean> obs3 = Observable.from(new Boolean[]{true,true});
然后1, Blah, True
和2, Hello, True
是传递到zip函数中的唯一项目。3
由于其他可观察物均已完成,因此该项目将永远不会被压缩。