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) })
我想创建一个 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) })