Rx java Kotlin和RxJava—为什么我的Single.zip()没有编译?
我有点疯了。我试图创建一个Rx java Kotlin和RxJava—为什么我的Single.zip()没有编译?,rx-java,kotlin,Rx Java,Kotlin,我有点疯了。我试图创建一个Observable扩展函数(针对rxjava2.x)来发出平均发出量,但是Single.zip()函数出现编译错误。有人知道我做错了什么吗?我也试着对我所有的类型都很明确,但那不起作用 import io.reactivex.Observable import io.reactivex.Single import java.math.BigDecimal fun Observable<BigDecimal>.sum() = reduce { total
Observable
扩展函数(针对rxjava2.x)来发出平均发出量,但是Single.zip()
函数出现编译错误。有人知道我做错了什么吗?我也试着对我所有的类型都很明确,但那不起作用
import io.reactivex.Observable
import io.reactivex.Single
import java.math.BigDecimal
fun Observable<BigDecimal>.sum() = reduce { total, next -> total + next }
//compile error
fun Observable<BigDecimal>.average() = publish().autoConnect(2).let {
Single.zip(it.sum().toSingle(), it.count()) {
sum, count -> sum / BigDecimal.valueOf(count)
}
}
导入io.reactivex.Observable
导入io.reactivex.Single
导入java.math.BigDecimal
fun Observable.sum()=减少{total,next->total+next}
//编译错误
有趣的可观察。平均值()=发布()。自动连接(2)。让{
Single.zip(it.sum().toSingle(),it.count()){
sum,count->sum/BigDecimal.valueOf(count)
}
}
由于某种原因,类型推断失败,在该上下文中,必须以某种方式推断出多个类型组合 您可以使用更传统(遗憾的是更详细)的语法显式指定类型,如下所示:
fun Observable<BigDecimal>.average() = publish().autoConnect(2).let {
Single.zip(it.sum().toSingle(), it.count(), BiFunction<BigDecimal, Long, BigDecimal> {
sum, count ->
sum / BigDecimal.valueOf(count)
})
}
类型推断通常不适用于rxJava2。实际上这不是一个类型推断问题。Kotlin通常生成用Kotlin函数类型替换SAM的扩展方法,但由于某些原因,这种技术不适用于重写的方法 这里有更多细节 作为一个选项,您可以尝试为lambda参数指定类型
fun Observable<BigDecimal>.average() = publish().autoConnect(2).let {
Single.zip(it.sum().toSingle(), it.count(), BiFunction {
sum: BigDecimal, count: Long ->
sum / BigDecimal.valueOf(count)
})
}
fun Observable.average()=publish().autoConnect(2).let{
Single.zip(it.sum().toSingle()、it.count()、BiFunction{
总和:BigDecimal,计数:Long->
sum/BigDecimal.valueOf(计数)
})
}
如果类型推断是个问题,那么可以使用
RxKotlin专门提供了帮助缓解类型推断问题的功能
那么,
Singles.zip(..., ...)
将能够正常工作,没有任何歧义。请注意,我使用的是
Singles
,而不是Single
当询问错误时,请发布错误。我本来打算这样做,但忘记了,稍后将更新以供参考。错误是什么?在上面添加了带有错误弹出窗口的屏幕剪辑。Ew。。。好的,我明天会运行这个,如果有效,我会继续跟进。如果不能推断出这是不幸的。嘿,我刚刚用一个更好的解决方案更新了我的答案。谢谢,给Stepan答案,因为它可以最大化推理。如果我有三个或更多的单子在压缩,双功能似乎不起作用,因为它只需要two@IzzoObella,在这种情况下,你需要使用Function3而不是BiFunctionIt’好的,我通过使用RxKotlin得到了一个解决方案,它有一个扩展函数来实现它。写完整的双函数声明,包括像这样的泛型,看起来要干净得多。双功能{a,b->Pair(a,b)})当我不知道单打的数量时,是否可以使用Singles.zip(…,…)
当我不知道单打的数量时(在列表中有单打)?@Micer我想我需要更多的上下文,这听起来像是保证了它自己的问题我有N个URL,我需要进行N个网络调用并合并结果。我已经创建了单曲,并将它们放在列表中。我不能使用Singles.zip(…,…)
,因为它接受确切数量的单个对象。我最终通过使用Single-zip(final-Iterable)解决了这个问题
implementation "io.reactivex.rxjava2:rxkotlin:$rxKotlinVersion"
Singles.zip(..., ...)