合并一个可观察对象列表,然后等待所有完成

合并一个可观察对象列表,然后等待所有完成,第1张

合并一个可观察对象列表,然后等待所有完成

听起来您正在寻找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
由于其他可观察物均已完成,因此该项目永远不会被压缩。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5428425.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存