听起来您正在寻找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 函数只能接受单个参数,因为列表中可观察量的类型及其数量都不知道。这意味着 zip 函数必须检查参数的数量并相应地强制转换它们。Object[]
无论如何,上述所有示例最终都会打印出来。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
然后,这将是传递到 zip 函数中的唯一项目。由于其他可观察量已完成,因此永远不会压缩该项。1, Blah, True
2, Hello, True
3