Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rx java Kotlin和RxJava—为什么我的Single.zip()没有编译?_Rx Java_Kotlin - Fatal编程技术网

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(..., ...)