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

例如,当我使用9个参数时,它可以按预期工作。当我添加第十个参数时,收到错误消息“无法推断该参数的类型”。请明确指定

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()
}

最佳答案

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


  返回一个Observable,它发出指定的combiner函数的结果,该函数按顺序通过其他IterableObservableSource发射到项组合。
  zip按严格顺序应用此功能,因此新ObservableSource发出的第一项将是应用到每个源ObservableSource发出的第一项的函数的结果;新的ObservableSource发出的第二项将是应用到这些ObservableSource的每一个发出的第二项的函数的结果;等等。
  
  从zip返回的结果ObservableSource<R>将调用onNext次数与发出最少项目的源onNextObservableSource调用次数相同。
  
  如果其中一个来源的资源比其他来源的资源短,而其他来源则更容易完成,那么操作员将按照其指定的顺序订阅其来源,并热切完成。因此,其他源可能永远无法运行完成(因此无法调用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不允许使用新的T[]创建通用数组,因此该操作符的实现必须创建一个Object[]。不幸的是,传递给该方法的Function<Integer[], R>会触发ClassCastException

10-08 17:41