web-dev-qa-db-ja.com

RxJava zipWith IDE KotlinでAndroid Studio 3.0を使用するとエラーが発生する

最初のオブザーバブルからのアイテムが少しの時間遅れで放出されるように、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クラスからすべて変換したところから変換しました

13
K.Os

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

この種のノイズを隠すために、小さなラッパーに付属している RxKotlin を使用することもできます。以下は、Single.zipWithの例です。

fun <T, U> Single<T>.zipWith(other: SingleSource<U>): Single<Pair<T,U>>
    = zipWith(other, BiFunction { t, u -> Pair(t,u) })
6
HeikoG