最初のオブザーバブルからのアイテムが少しの時間遅れで放出されるように、Interval ObservableのオブジェクトのリストとObservableを含むオブジェクトのリストを放出するObservableを作成します。これが私の実装です:
val just1 = ArrayList<SomeClass1>()
いくつかのアイテムを投入する
fun populateJust1() {
just1.add(SomeClass1("23", 23))
just1.add(SomeClass1("24", 24))
just1.add(SomeClass1("25", 25))
}
populateJust1()
監視可能な間隔でZip
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 zipWith(other:((observer:Observer)→Unit)!, zipper:((t1:SomeClass1、t2:U)→R)!):観測可能! io.reactivex.Observable zipWith(ObservableSource !, BiFunction!)で定義されています。Rは推論できません。 U = Long! for fun zipWith(other:ObservableSource !, zipper:BiFunction!):Observable! io.reactivex.Observable zipWith((Mutable)Iterable !, BiFunction!)で定義されています。ここで、U、Rは、fun 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)!):観察可能! io.reactivex.Observableで定義
なにが問題ですか?私はこのコードをJavaクラスからすべて変換したところから変換しました
KotlinはそのzipWith
ラムダの型を推測できません。
ラムダの代わりに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())
この種のノイズを隠すために、小さなラッパーに付属している RxKotlin を使用することもできます。以下は、Single.zipWithの例です。
fun <T, U> Single<T>.zipWith(other: SingleSource<U>): Single<Pair<T,U>>
= zipWith(other, BiFunction { t, u -> Pair(t,u) })