Introduktion til RxKotlin

1. Oversigt

I denne vejledning vil vi gennemgå brugen af Reaktive udvidelser (Rx) i idiomatisk Kotlin ved hjælp af RxKotlin-biblioteket.

RxKotlin er ikke i sig selv en implementering af Reactive Extensions. I stedet er det for det meste en samling af udvidelsesmetoder. Det vil sige, RxKotlin udvider RxJava bibliotek med en API designet med Kotlin i tankerne.

Derfor bruger vi koncepter fra vores artikel, Introduktion til RxJava, samt begrebet Flowables Vi har præsenteret i en dedikeret artikel.

2. Opsætning af RxKotlin

For at bruge RxKotlin i vores Maven-projekt skal vi tilføje rxkotlin afhængighed af vores pom.xml:

 io.reactivex.rxjava2 rxkotlin 2.3.0 

Eller for et Gradle-projekt til vores build.gradle:

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

Her bruger vi RxKotlin 2.x, der er målrettet mod RxJava 2. Projekter, der bruger RxJava 1, skal bruge RxKotlin 1.x. De samme begreber gælder for begge versioner.

Bemærk, at RxKotlin afhænger af RxJava, men de opdaterer ikke afhængigheden ofte til den seneste udgivelse. Så vi anbefaler eksplicit at inkludere den specifikke RxJava-version, vi vil være afhængige af, som beskrevet i vores RxJava-artikel.

3. Oprettelse Observerbars i RxKotlin

RxKotlin inkluderer en række udvidelsesmetoder, der skal oprettes Observerbar og Flydbar objekter fra samlinger.

I særdeleshed, hver type array har en tilObservable () metode og a toFlowable () metode:

val observerbar = listOf (1, 1, 2, 3) .toObservable () observerbar.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. Kompletabels

RxKotlin giver også nogle metoder til at oprette Kompletabel tilfælde. I særdeleshed, vi kan konvertere Handlings, Kan kaldess, Fremtids, og nul-arity-funktioner til Kompletabel med udvidelsesmetoden toCompletable:

var værdi = 0 val færdig = {værdi = 3} .toCompletable () assertFalse (completable.test (). isCancelled ()) assertEquals (3, værdi)

4. Observerbar og Flydbar til Kort og Multimap

Når vi har en Observerbar eller Flydbar der producerer Par tilfælde kan vi omdanne dem til en Enkelt observerbar, der producerer en Kort:

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 (Par ("a", 4), Par ("b", 2), Par ("c", 3)), kort.blockingGet ())

Som vi kan se i det foregående eksempel, at kortlægge overskriver værdier, der er udsendt tidligere med senere værdier, hvis de har den samme nøgle.

Hvis vi vil samle alle de værdier, der er knyttet til en nøgle, i en samling, bruger 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. Kombination Observerbars og Flydbars

Et af salgsargumenterne for Rx er muligheden for at kombinere Observerbars og Flydbars på forskellige måder. Faktisk leverer RxJava et antal operatører ud af kassen.

Derudover inkluderer RxKotlin et par flere udvidelsesmetoder til kombination Observerbars og lignende.

5.1. Kombination af observerbare emissioner

Når vi har en Observerbar der udsender andet Observerbars, vi kan bruge en af ​​udvidelsesmetoderne i RxKotlin til at kombinere de udsendte værdier.

I særdeleshed, fusionere alle kombinerer de observerbare med flatMap:

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

Hvilket ville være det samme som:

val observerbar = subject.flatMap {it}

Den resulterende Observerbar vil udsende alle kildens værdier Observerbars i en uspecificeret rækkefølge.

Tilsvarende concatAll anvendelser concatMap (værdierne udsendes i samme rækkefølge som kilderne), mens switchLatest anvendelser switchMap (værdier udsendes fra den sidst udsendte Observerbar).

Som vi har set indtil videre, alle ovennævnte metoder er tilvejebragt Flydbar også kilder, med samme semantik.

5.2. Kombinerer Færdigs,måskes, og Enkelts

Når vi har en Observerbar der udsender forekomster af Kompletabel, måske, eller Enkelt, kan vi kombinere dem med det relevante mergeAllXs metode som f.eks. 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 ( Undtagelse ("fejl"))) subject.onNext (Maybe.just (3)) observerbar.test (). AssertValues ​​(1, 2) .assertError (Undtagelse :: class.java)

5.3. Kombinerer Iterabels af Observerbars

Til samlinger af Observerbar eller Flydbar i stedet for har RxKotlin et par andre operatører, fusionere og mergeDelayError. De har begge virkningen af kombinerer alle de Observerbars eller Flydbars til en, der udsender alle værdierne i rækkefølge:

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

Forskellen mellem de to operatorer - som er direkte afledt af de samme navngivne operatorer i RxJava - er deres behandling af fejl.

Det fusionere metoden udsender fejl, så snart de udsendes af kilden:

// ... observables.add (Observable.error (Exception ("e"))) observables.add (Observable.just ("5th")) // ... observerbar.test (). assertValues ​​("første" , "andet", "tredje", "fjerde")

Der henviser til mergeDelayError udsender dem i slutningen af ​​strømmen:

// ... observables.add (Observable.error (Exception ("e"))) observables.add (Observable.just ("5th")) // ... observerbar.test (). assertValues ​​("første" , "andet", "tredje", "fjerde", "femte")

6. Håndtering af værdier af forskellige typer

Lad os nu se på udvidelsesmetoderne i RxKotlin til håndtering af værdier af forskellige typer.

Disse er varianter af RxJava-metoder, der gør brug af Kotlins reified generiske lægemidler. Vi kan især:

  • kaste udsendte værdier fra en type til en anden, eller
  • filtrer værdier ud, der ikke er af en bestemt type

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

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

Her er rollebesætningen unødvendig. Men når vi kombinerer forskellige observationer sammen, har vi muligvis brug for det.

Med ofType, i stedet kan vi filtrere værdier ud, der ikke er af den type, vi forventer:

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

Som altid, støbt og ofType gælder for begge Observerbars og Flydbars.

Desuden, måske understøtter også disse metoder. Det Enkelt klasse understøtter i stedet kun støbt.

7. Andre hjælpemetoder

Endelig inkluderer RxKotlin flere hjælpemetoder. Lad os se hurtigt.

Vi kan bruge abonner af i stedet for abonnere - det tillader navngivne parametre:

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

På samme måde kan vi bruge til at blokere abonnementer blockingSubscribeBy.

Derudover inkluderer RxKotlin nogle metoder, der efterligner dem i RxJava, men arbejder omkring en begrænsning af Kotlins type inferens.

For eksempel når du bruger Observerbar # lynlås, med angivelse af lynlås ser ikke så godt ud:

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

Så, Tilføjer RxKotlin Observable # zip til mere idiomatisk brug:

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

Bemærk de sidste "s" i Observerbare. På samme måde har vi det Flowables, singler, og Maybes.

8. Konklusioner

I denne artikel har vi grundigt gennemgået RxKotlin-biblioteket, som udvider RxJava for at få API'et til at ligne mere idiomatisk Kotlin.

For yderligere information henvises til RxKotlin GitHub-siden. For flere eksempler anbefaler vi RxKotlin-tests.

Implementeringen af ​​alle disse eksempler og kodestykker findes i GitHub-projektet som et Maven- og Gradle-projekt, så det skal være let at importere og køre som det er.


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