2017-11-17 266 views
3

我想创建一个Observable,它发出一些来自Observable和Observable的包含Interval Observable的对象列表,以便来自第一个可观察对象的项目将以一定的时间延迟发射。 这是我实现:RxJava zipWith使用Android Studio 3.0在Kotlin中的IDE错误

val just1 = ArrayList<SomeClass1>() 

填充某些项目

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

populateJust1() 

,并与间隔可观测

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的工作室3.0下划线红色zipWith运营商和说:

使用提供的参数不能调用以下函数。 (((observer:Observer)→Unit)!,((t1:SomeClass1,t2:Long)→R)!)其中R不能被推断; U =长乐趣zipWith(其他:((观察者:观察者)→单位)!,拉链:((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(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类转换了此代码,其中一切都正确

回答

2

Kotlin无法推断出该zipWith 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()) 
1

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

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