Je veux créer un observable qui émet certains éléments de et observable contenant une liste d'objets avec Intervalle observable, de sorte que les éléments du premier observable soient émis avec un certain retard. Voici ma mise en œuvre:
val just1 = ArrayList<SomeClass1>()
remplir certains éléments
fun populateJust1() {
just1.add(SomeClass1("23", 23))
just1.add(SomeClass1("24", 24))
just1.add(SomeClass1("25", 25))
}
populateJust1()
et Zip avec l'intervalle observable
Observable.fromIterable(just1)
.zipWith(Observable.interval(2, TimeUnit.SECONDS)) { item: SomeClass1, interval: Long -> item }
.subscribe(Consumer<SomeClass1> { someClass1 -> Log.v("someClass1", someClass1.toString()) })
Cependant l'IDE, Android Studio 3.0 souligne en rouge l'opérateur zipWith et dit:
Aucune des fonctions suivantes ne peut être appelée avec les arguments fournis. zipAvec (((observateur: observateur) → Unité) !, ((t1: SomeClass1, t2: Long) → R)!) où R ne peut pas être déduit; U = Long for fun zipAvec (autre: ((observateur: Observateur) → Unité) !, fermeture éclair: ((t1: SomeClass1, t2: U) → R)!): Observable! défini dans io.reactivex.Observable zipWith (ObservableSource !, BiFunction!) où R ne peut pas être déduit; U = Long! pour le plaisir zipAvec (autre: ObservableSource !, fermeture éclair: BiFunction!): Observable! défini dans io.reactivex.Observable zipWith ((Mutable) Iterable !, BiFunction!) où U, R ne peut pas être déduit pour le plaisir zipWith (other: (Mutable) Iterable !, zipper: BiFunction!): Observable! défini dans io.reactivex.Observable zipWith ((Mutable) Iterable !, ((t1: SomeClass1, t2: Long) → R)!) où R ne peut pas être déduit; U = long for fun zipAvec (autre: (Mutable) Iterable !, fermeture éclair: ((t1: SomeClass1, t2: U) → R)!): Observable! défini dans io.reactivex.Observable
Qu'est-ce qui ne va pas? Je viens de convertir ce code de Java classe où tout était correct
Kotlin ne peut pas déduire les types dans ce zipWith
lambda.
Utilisez un BiFunction
au lieu du 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())
Vous pouvez également utiliser RxKotlin qui est fourni avec quelques petits wrappers pour masquer ce type de bruit. Voici un exemple pour Single.zipWith:
fun <T, U> Single<T>.zipWith(other: SingleSource<U>): Single<Pair<T,U>>
= zipWith(other, BiFunction { t, u -> Pair(t,u) })