RxJava zip在使用Android Studio 3.0的Kotlin中出现IDE错误

2022-09-02 23:43:35

我想创建一个可观察量,它发出一些项目,可观察包含间隔可观察的对象列表,以便第一个可观察对象中的项目将以一些时间延迟发出。这是我的实现:

 val just1 = ArrayList<SomeClass1>()

填充某些项目

fun populateJust1() {
just1.add(SomeClass1("23", 23))
just1.add(SomeClass1("24", 24))
just1.add(SomeClass1("25", 25))
}

populateJust1()

和 zip 与间隔可观察

Observable.fromIterable(just1)
            .zipWith(Observable.interval(2, TimeUnit.SECONDS)) { item: SomeClass1, interval: Long -> item }
            .subscribe(Consumer<SomeClass1> { someClass1 -> Log.v("someClass1", someClass1.toString()) })

然而,IDE,Android Studio 3.0用红色下划线zipWith运算符,并说:

不能使用提供的参数调用以下任何函数。zipWith(((observer: Observer) → Unit)!, ((t1: SomeClass1, t2: Long) → R)!) 其中 R 无法推断;U = Long for fun zipWith(other: ((observer: Observer) → Unit)!, zipper: ((t1: SomeClass1, t2: U) → R)!): Observable!在io.reactivex.Observable zipWith(ObservableSource!,BiFunction!)中定义,其中R无法推断;U = 长!对于有趣的zipWith(其他:ObservableSource!,拉链:BiFunction!):可观察!在io.reactivex.Observable zipWith((Mutable)Iterable!, BiFunction!) 中定义,其中 U, R 不能被推断为有趣的 zipWith(其他:(可变)Iterable!, zipper: BiFunction!): Observable!在io.reactivex.Observable zipWith((Mutable)Iterable!, ((t1: SomeClass1, t2: Long) → R)!) 中定义,其中R无法推断;U = Long for fun zipWith(other: (Mutable)Iterable!, zipper: ((t1: SomeClass1, t2: U) → R)!): Observable!在 io.reactivex.Observable 中定义

怎么了?我刚刚从Java类转换了这段代码,一切都是正确的


答案 1

Kotlin 无法推断出 lambda 中的类型。zipWith

使用 a 而不是 lambda:BiFunction

data class SomeClass(val a: String, val b: Int)

val list = listOf(SomeClass("1", 1), SomeClass("2", 2))

Observable
        .fromIterable(list)
        .zipWith(Observable.interval(2, TimeUnit.SECONDS),
                BiFunction { item: SomeClass, _: Long -> item })
        .subscribe { Log.v("someClass", it.toString())

答案 2

你也可以使用RxKotlin,它带有一些小包装器来隐藏这种噪音。下面是 Single.zipWith 的一个示例:

fun <T, U> Single<T>.zipWith(other: SingleSource<U>): Single<Pair<T,U>>
    = zipWith(other, BiFunction { t, u -> Pair(t,u) })

推荐