web-dev-qa-db-fra.com

RxJava zipWith IDE dans Kotlin en utilisant Android Studio 3.0)

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

13
K.Os

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

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) })
6
HeikoG