.zip方法中可观察数的数量是否有限制?

时间:2018-06-19 21:40:58

标签: java android kotlin rx-java rx-kotlin

在Kotlin的zip方法中,用作参数的Observable数量似乎受到限制。如果这是正确的,最好的选择是什么?

例如,当我使用9个参数时,它可以按预期工作。添加第10个参数时,出现错误无法推断该参数的类型。请明确指定

Observable.zip(
            //TODO: parameterize exchange symbols based on pair
            methodOne() as Observable<Any>),
            methodTwo() as Observable<Any>),
            methodThree() as Observable<Any>),
            methodFour() as Observable<Any>),
            methodFive() as Observable<Any>),
            methodSix() as Observable<Any>),
            methodSeven() as Observable<Any>),
            methodEight() as Observable<Any>),
            methodNine() as Observable<Any>),
            { oneResult, twoResult, threeResult, fourResult, fiveResult, sixResult, sevenResult, eightResult, nineResult ->
                    //logic here applying computation to results
            })
            .subscribe(
                    {},
                    {
                        println(String.format("Error: %s", it.message))
                    })
            .unsubscribe()
}

3 个答案:

答案 0 :(得分:3)

RxJava仅使用zip支持多达9个不同的源。除此之外,您还必须使用zip(Iterable<ObservableSource>, Func<Object[],R>)方法并将Object[]的每个元素强制转换回其各自的类型。

  

返回一个Observable,它发出指定combiner函数的结果,该函数应用于由其他Iterable的{​​{1}}依次发出的项的组合。   zip按严格的顺序应用此功能,因此新ObservableSource发出的第一项将是函数应用于每个源ObservableSource发出的第一项的结果;新的ObservableSource发出的第二项将是函数应用于这些ObservableSource中的每一个发出的第二项的结果;等等。

     

从zip返回的结果ObservableSource调用ObservableSource<R>的次数是发出最少项目的源onNext的{​​{1}}调用的次数。

     

如果其中一个来源的资源比其他来源的资源短,而其他来源则更容易完成,操作员将按照其指定的顺序订阅其来源,并热切地完成操作。因此,其他那些源可能永远无法运行完成(因此无法调用onNext)。如果光源长度完全相同,也会发生这种情况。如果源A完成并且B已被消耗并即将完成,则操作员将检测到A将不再发送其他值,它将立即处置B。例如:

ObservableSource
     

doOnComplete()将被调用,但zip(Arrays.asList(range(1, 5).doOnComplete(action1), range(6, 5).doOnComplete(action2)), (a) -> a) 将不会被调用。   要变通解决此终止属性,请同时使用action1或在完成或进行action2调用时使用doOnDispose(Action)进行清理。   关于方法签名的注意事项:由于Java不允许使用新的using()创建通用数组,因此该操作符的实现必须创建一个dispose()。不幸的是,传递给该方法的T[]会触发Object[]

答案 1 :(得分:0)

是的,有几种重载的方法tf.map_fn,其中参数Observable.zip()的最大数目是9:

ObservableSource

如果您希望拥有9个以上的来源,请查看zipArrayzipIterable

答案 2 :(得分:0)

根据Oracle Java Doc:http://reactivex.io/RxJava/javadoc/rx/Observable.html#zip(java.lang.Iterable,%20rx.functions.FuncN)

这些方法存在:

static <R> Observable<R>    zip(java.lang.Iterable<? extends Observable<?>> ws, FuncN<? extends R> zipFunction)

static <R> Observable<R>    zip(Observable<?>[] ws, FuncN<? extends R> zipFunction)

static <R> Observable<R>    zip(Observable <? extends Observable<?>> ws, FuncN<? extends R> zipFunction)

static <T1,T2,R> Observable<R>  zip(Observable<? extends T1> o1, Observable<? extends T2> o2, Func2<? super T1,? super T2,? extends R> zipFunction)

static <T1,T2,T3,R>
Observable<R>   zip(Observable<? extends T1> o1, Observable<? extends T2> o2, Observable<? extends T3> o3, Func3<? super T1,? super T2,? super T3,? extends R> zipFunction)

static <T1,T2,T3,T4,R>
Observable<R>   zip(Observable<? extends T1> o1, Observable<? extends T2> o2, Observable<? extends T3> o3, Observable<? extends T4> o4, Func4<? super T1,? super T2,? super T3,? super T4,? extends R> zipFunction)

static <T1,T2,T3,T4,T5,R>
Observable<R>   zip(Observable<? extends T1> o1, Observable<? extends T2> o2, Observable<? extends T3> o3, Observable<? extends T4> o4, Observable<? extends T5> o5, Func5<? super T1,? super T2,? super T3,? super T4,? super T5,? extends R> zipFunction)


static <T1,T2,T3,T4,T5,T6,R>
Observable<R>   zip(Observable<? extends T1> o1, Observable<? extends T2> o2, Observable<? extends T3> o3, Observable<? extends T4> o4, Observable<? extends T5> o5, Observable<? extends T6> o6, Func6<? super T1,? super T2,? super T3,? super T4,? super T5,? super T6,? extends R> zipFunction)

static <T1,T2,T3,T4,T5,T6,T7,R>
Observable<R>   zip(Observable<? extends T1> o1, Observable<? extends T2> o2, Observable<? extends T3> o3, Observable<? extends T4> o4, Observable<? extends T5> o5, Observable<? extends T6> o6, Observable<? extends T7> o7, Func7<? super T1,? super T2,? super T3,? super T4,? super T5,? super T6,? super T7,? extends R> zipFunction)

static <T1,T2,T3,T4,T5,T6,T7,T8,R>
Observable<R>   zip(Observable<? extends T1> o1, Observable<? extends T2> o2, Observable<? extends T3> o3, Observable<? extends T4> o4, Observable<? extends T5> o5, Observable<? extends T6> o6, Observable<? extends T7> o7, Observable<? extends T8> o8, Func8<? super T1,? super T2,? super T3,? super T4,? super T5,? super T6,? super T7,? super T8,? extends R> zipFunction)

static <T1,T2,T3,T4,T5,T6,T7,T8,T9,R>
Observable<R>   zip(Observable<? extends T1> o1, Observable<? extends T2> o2, Observable<? extends T3> o3, Observable<? extends T4> o4, Observable<? extends T5> o5, Observable<? extends T6> o6, Observable<? extends T7> o7, Observable<? extends T8> o8, Observable<? extends T9> o9, Func9<? super T1,? super T2,? super T3,? super T4,? super T5,? super T6,? super T7,? super T8,? super T9,? extends R> zipFunction)

因此,要有9个以上的元素使用数组或可迭代数组,它将变得更简单