RxJava zipWith IDE 在 Kotlin 中使用 Android Studio 3.0 时出错

RxJava zipWith IDE error in Kotlin using Android Studio 3.0

我想创建一个 Observable,它从 Observable 发出一些项目,Observable 包含具有 Interval Observable 的对象列表,这样来自第一个 observable 的项目将在一些时间延迟后发出。 这是我的实现:

 val just1 = ArrayList<SomeClass1>()

填充一些项目

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

populateJust1()

并使用间隔 Observable

进行压缩
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 运算符下用红色下划线表示:

None of the following functions can be called with the arguments supplied. zipWith(((observer: Observer) → Unit)!, ((t1: SomeClass1, t2: Long) → R)!)   where R cannot be inferred; U = Long for   fun zipWith(other: ((observer: Observer) → Unit)!, zipper: ((t1: SomeClass1, t2: U) → R)!): Observable! defined in io.reactivex.Observable zipWith(ObservableSource!, BiFunction!)   where R cannot be inferred; U = Long! for   fun zipWith(other: ObservableSource!, zipper: BiFunction!): Observable! defined in io.reactivex.Observable zipWith((Mutable)Iterable!, BiFunction!)   where U, R cannot be inferred for   fun zipWith(other: (Mutable)Iterable!, zipper: BiFunction!): Observable! defined in io.reactivex.Observable zipWith((Mutable)Iterable!, ((t1: SomeClass1, t2: Long) → R)!)   where R cannot be inferred; U = Long for   fun zipWith(other: (Mutable)Iterable!, zipper: ((t1: SomeClass1, t2: U) → R)!): Observable! defined in io.reactivex.Observable

怎么了?我刚刚将此代码从 Java class 转换为一切正确的

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

使用 BiFunction 而不是 lambda:

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

您也可以使用 RxKotlin 附带的一些小包装来隐藏这种噪音。这是 Single.zipWith:

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