3 回答
TA贡献1852条经验 获得超1个赞
RxJava仅使用最多支持9个不同的源zip
。除此之外,您还必须使用zip(Iterable<ObservableSource>, Func<Object[],R>)
方法并将Object[]
back的每个元素转换为其各自的类型。
返回一个
Observable
,该数组发出指定combiner
函数的结果,该函数应用于Iterable
其他ObservableSource
s依次发出的项的组合。zip按严格顺序应用此功能,因此new发出的第一项ObservableSource
将是应用到每个源ObservableSource
s发出的第一项的函数的结果;new发出的第二个项目ObservableSource
将是每个ObservableSource
s发出的应用于第二个项目的函数的结果;等等。
ObservableSource<R>
从zip返回的结果将调用发出最少项目的源onNext
的onNext
调用次数ObservableSource
。如果其中一个来源的资源比其他来源的资源短,而其他来源则更容易完成,那么操作员将按照其指定的顺序订阅其来源,并热切地完成操作。因此,其他来源可能永远无法运行完成(因此无法调用
doOnComplete()
)。如果光源长度完全相同,也会发生这种情况。如果源A完成并且B已被消耗并即将完成,则操作员将检测到A将不再发送其他值,它将立即处置B。例如:zip(Arrays.asList(range(1, 5).doOnComplete(action1), range(6, 5).doOnComplete(action2)), (a) -> a)
action1
将被调用,但action2
不会。要变通解决此终止属性,请使用doOnDispose(Action)
或using()
在完成或dispose()
调用的情况下使用或进行清理。关于方法签名的注意事项:由于Java不允许使用new创建通用数组T[]
,因此该操作符的实现必须创建一个Object[]
replace。不幸的是,Function<Integer[], R>
传递给方法会触发ClassCastException
。
添加回答
举报