听起来您正在寻找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}); //Emits three itemsObservable<String> obs2 = Observable.from(new String[]{"Blah","Hello"}); //Emits two itemsObservable<Boolean> obs3 = Observable.from(new Boolean[]{true,true}); //Emits two items
然后
1, Blah, True和
2, Hello,True是传递到zip函数中的唯一项目。
3由于其他可观察物均已完成,因此该项目永远不会被压缩。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)