Introduksjon til RxKotlin

1. Oversikt

I denne opplæringen skal vi gjennomgå bruken av Reactive Extensions (Rx) i idiomatisk Kotlin ved bruk av RxKotlin-biblioteket.

RxKotlin er ikke en implementering av Reactive Extensions, per se. I stedet er det for det meste en samling utvidelsesmetoder. Det vil si at RxKotlin utvider RxJava bibliotek med en API designet med tanke på Kotlin.

Derfor bruker vi konsepter fra artikkelen vår, Introduksjon til RxJava, samt begrepet Flytbare stoffer vi har presentert i en dedikert artikkel.

2. RxKotlin-oppsett

For å bruke RxKotlin i vårt Maven-prosjekt, må vi legge til rxkotlin avhengighet til vår pom.xml:

 io.reactivex.rxjava2 rxkotlin 2.3.0 

Eller, for et Gradle-prosjekt, til vårt build.gradle:

implementering 'io.reactivex.rxjava2: rxkotlin: 2.3.0'

Her bruker vi RxKotlin 2.x, som retter seg mot RxJava 2. Prosjekter som bruker RxJava 1, bør bruke RxKotlin 1.x. De samme konseptene gjelder for begge versjoner.

Merk at RxKotlin er avhengig av RxJava, men de oppdaterer ikke avhengigheten ofte til den siste utgivelsen. Så vi anbefaler å eksplisitt inkludere den spesifikke RxJava-versjonen vi kommer til å stole på, som beskrevet i vår RxJava-artikkel.

3. Å skape Observerbars i RxKotlin

RxKotlin inkluderer en rekke utvidelsesmetoder å lage Observerbar og Flytbar objekter fra samlinger.

Spesielt, hver type matrise har en tilObservable () metode og a toFlowable () metode:

val observable = listOf (1, 1, 2, 3) .toObservable () observerable.test (). assertValues ​​(1, 1, 2, 3)
val flowable = listOf (1, 1, 2, 3) .toFlowable () flowable.buffer (2) .test (). assertValues ​​(listOf (1, 1), listOf (2, 3))

3.1. Fullførbars

RxKotlin gir også noen metoder for å lage Fullførbar tilfeller. Spesielt, vi kan konvertere Handlings, Kan kalless, Framtids, og null-arity funksjoner til Fullførbar med utvidelsesmetoden toCompletable:

var verdi = 0 val fullført = {verdi = 3} .toCompletable () assertFalse (complete.test (). isCancelled ()) assertEquals (3, value)

4. Observerbar og Flytbar til Kart og Multikart

Når vi har en Observerbar eller Flytbar som produserer Par tilfeller kan vi forvandle dem til en Enkelt observerbar som produserer en Kart:

val list = listOf (Pair ("a", 1), Pair ("b", 2), Pair ("c", 3), Pair ("a", 4)) val observerbar = list.toObservable () val map = observerbar.toMap () assertEquals (mapOf (Pair ("a", 4), Pair ("b", 2), Pair ("c", 3)), map.blockingGet ())

Som vi kan se i forrige eksempel, å kartlegge overskriver verdier som ble sendt tidligere med senere verdier hvis de har samme nøkkel.

Hvis vi vil samle alle verdiene som er knyttet til en nøkkel i en samling, bruker vi tilMultimap i stedet:

val list = listOf (Pair ("a", 1), Pair ("b", 2), Pair ("c", 3), Pair ("a", 4)) val observerbar = list.toObservable () val map = observerbar.tilMultimap () assertEquals (mapOf (Pair ("a", listOf (1, 4)), Pair ("b", listOf (2)), Pair ("c", listOf (3))), map.blockingGet ())

5. Kombinere Observerbars og Flytbars

Et av salgsargumentene til Rx er muligheten til å kombinere Observerbars og Flytbars på forskjellige måter. Faktisk gir RxJava en rekke operatører ut av boksen.

I tillegg til det inkluderer RxKotlin noen flere utvidelsesmetoder for å kombinere Observerbars og lignende.

5.1. Kombinere observerbare utslipp

Når vi har en Observerbar som avgir andre Observerbars, kan vi bruke en av utvidelsesmetodene i RxKotlin for å kombinere de utsendte verdiene.

Spesielt, fletteAlle kombinerer observerbare med flatMap:

val subject = PublishSubject.create() val observerbar = subject.mergeAll ()

Som ville være det samme som:

val observerbar = subject.flatMap {it}

Resultatet Observerbar vil avgi alle verdiene til kilden Observerbars i en uspesifisert rekkefølge.

På samme måte, concatAll bruker concatMap (verdiene sendes ut i samme rekkefølge som kildene), samtidig som switchLatest bruker switchMap (verdiene sendes ut fra den sist sendte Observerbar).

Som vi har sett så langt, alle metodene ovenfor er forutsatt Flytbar kilder også, med samme semantikk.

5.2. Kombinere Fullførbars,Kan væres, og Enkelts

Når vi har en Observerbar som avgir forekomster av Fullførbar, Kan være, eller Enkelt, kan vi kombinere de med det aktuelle mergeAllXs metode som for eksempel mergeAllMaybes:

val subject = PublishSubject.create() val observerbar = subject.mergeAllMaybes () subject.onNext (Maybe.just (1)) subject.onNext (Maybe.just (2)) subject.onNext (Maybe.empty ()) subject.onNext (Maybe.error ( Unntak ("feil"))) subject.onNext (Maybe.just (3)) observerbar.test (). AssertValues ​​(1, 2) .assertError (Unntak :: class.java)

5.3. Kombinere Iterabels av Observerbars

For samlinger av Observerbar eller Flytbar i stedet har RxKotlin et par andre operatører, slå sammen og mergeDelayError. De har begge effekten av kombinere alle Observerbars eller Flytbars til en som vil avgi alle verdiene i rekkefølge:

val observables = mutableListOf (Observable.just ("first", "second")) val observable = observables.merge () observables.add (Observable.just ("tredje", "fjerde")) observerbar.test (). assertValues ("Første andre tredje fjerde")

Forskjellen mellom de to operatørene - som er direkte avledet fra de samme navnene i RxJava - er deres behandling av feil.

De slå sammen metoden sender ut feil så snart de sendes ut av kilden:

// ... observables.add (Observable.error (Exception ("e"))) observables.add (Observable.just ("5th")) // ... observerbar.test (). assertValues ​​("first" , "andre", "tredje", "fjerde")

Mens mergeDelayError sender dem ut på slutten av strømmen:

// ... observables.add (Observable.error (Exception ("e"))) observables.add (Observable.just ("5th")) // ... observerbar.test (). assertValues ​​("first" , "andre", "tredje", "fjerde", "femte")

6. Håndtering av verdier av forskjellige typer

La oss nå se på utvidelsesmetodene i RxKotlin for å håndtere verdier av forskjellige typer.

Dette er varianter av RxJava-metoder som bruker Kotlins reified generiske legemidler. Spesielt kan vi:

  • kaste utsendte verdier fra en type til en annen, eller
  • filtrer ut verdier som ikke er av en bestemt type

Så vi kunne for eksempel kaste et Observerbar av Nummers til en av Ints:

val observerbar = Observerbar.just (1, 1, 2, 3) observerbar.cast (). test (). assertValues ​​(1, 1, 2, 3)

Her er rollebesetningen unødvendig. Men når vi kombinerer forskjellige observasjoner sammen, kan det hende vi trenger det.

Med ofType, i stedet kan vi filtrere ut verdier som ikke er av den typen vi forventer:

val observerbar = Observerbar.just (1, "og", 2, "og") observerbar.ofType (). test (). assertValues ​​(1, 2)

Som alltid, rollebesetning og ofType gjelder begge deler Observerbars og Flytbars.

Dessuten, Kan være støtter også disse metodene. De Enkelt klasse støtter i stedet bare rollebesetning.

7. Andre hjelpemetoder

Til slutt inkluderer RxKotlin flere hjelpemetoder. La oss se raskt.

Vi kan bruke abonner av i stedet for abonnere - det tillater navngitte parametere:

Observable.just (1) .subscribeBy (onNext = {println (it)})

På samme måte kan vi bruke for å blokkere abonnementer blockingSubscribeBy.

I tillegg inkluderer RxKotlin noen metoder som etterligner de i RxJava, men jobber rundt en begrensning av Kotlins type inferens.

For eksempel når du bruker Observerbar # glidelås, spesifisere glidelås ser ikke så bra ut:

Observable.zip (Observable.just (1), Observable.just (2), BiFunction {a, b -> a + b})

Så, RxKotlin legger til Observables # zip for mer idiomatisk bruk:

Observables.zip (Observable.just (1), Observable.just (2)) {a, b -> a + b}

Legg merke til de siste "s" i Observerbare. Tilsvarende har vi Flowables, singler, og Maybes.

8. Konklusjoner

I denne artikkelen har vi grundig gjennomgått RxKotlin-biblioteket, som utvider RxJava slik at API-et ser mer ut som idiomatisk Kotlin.

For mer informasjon, se RxKotlin GitHub-siden. For flere eksempler anbefaler vi RxKotlin-tester.

Implementeringen av alle disse eksemplene og kodebitene finnes i GitHub-prosjektet som et Maven og Gradle-prosjekt, så det skal være enkelt å importere og kjøre som det er.


$config[zx-auto] not found$config[zx-overlay] not found