【问题标题】:RxJava zipWith IDE error in Kotlin using Android Studio 3.0使用 Android Studio 3.0 在 Kotlin 中出现 RxJava zipWith IDE 错误
【发布时间】:2018-05-01 18:56:29
【问题描述】:

我想创建一个 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 操作符并说:

以下函数都不能使用提供的参数调用。 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 = 长! for   fun zipWith(other: ObservableSource!, zipper: BiFunction!): Observable!在 io.reactivex.Observable 中定义 zipWith((Mutable)Iterable!, BiFunction!) 其中 U, R 不能被推断为有趣的 zipWith(other: (Mutable)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 类转换了这段代码

【问题讨论】:

    标签: java kotlin rx-java rx-java2


    【解决方案1】:

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

    【讨论】:

      【解决方案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) })
      

      【讨论】:

        猜你喜欢
        • 2019-02-27
        • 2018-09-17
        • 2022-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多