使用Android Studio 3.0在Kotlin中使用RxJava zipWith IDE

K.O*_*.Os 11 java kotlin rx-java rx-java2

我想创建一个Observable,它从Observable中发出一些包含Interval Observable对象列表的项目,这样第一个observable中的项目就会有一些时间延迟.这是我的实现:

 val just1 = ArrayList<SomeClass1>()
Run Code Online (Sandbox Code Playgroud)

填充一些项目

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

populateJust1()
Run Code Online (Sandbox Code Playgroud)

和区间Observable压缩

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

但是,IDE,Android Studio 3.0以红色方式强调了zipWith运算符,并说:

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

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

ESa*_*ala 20

Kotlin无法推断出zipWithlambda中的类型.

使用a 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())
Run Code Online (Sandbox Code Playgroud)


Hei*_*koG 7

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

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