Uvod u RxKotlin

1. Pregled

U ovom uputstvu pregledat ćemo upotrebu Reaktivna proširenja (Rx) u idiomatskom Kotlinu pomoću biblioteke RxKotlin.

RxKotlin sam po sebi nije implementacija reaktivnih proširenja. Umjesto toga, to je uglavnom zbirka metoda produženja. Odnosno, RxKotlin povećava RxJava knjižnica s API-jem dizajniranim s obzirom na Kotlin.

Stoga ćemo koristiti koncepte iz našeg članka, Uvod u RxJavu, kao i koncept Cvjetnice predstavili smo u posebnom članku.

2. Postavljanje RxKotlina

Da bismo koristili RxKotlin u našem projektu Maven, trebat ćemo dodati rxkotlin ovisnost o našoj pom.xml:

 io.reactivex.rxjava2 rxkotlin 2.3.0 

Ili, za projekt Gradle, našem build.gradle:

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

Ovdje koristimo RxKotlin 2.x koji cilja RxJava 2. Projekti koji koriste RxJava 1 trebali bi koristiti RxKotlin 1.x. Isti koncepti vrijede za obje verzije.

Imajte na umu da RxKotlin ovisi o RxJavi, ali ovisnost ne ažuriraju često na najnovije izdanje. Dakle, preporučujemo da izričito uključite određenu verziju RxJave o kojoj ćemo ovisiti, kao što je detaljno objašnjeno u našem članku RxJava.

3. Stvaranje Uočljivs u RxKotlinu

RxKotlin uključuje brojne metode produženja za stvaranje Uočljiv i Tekuće predmeti iz zbirki.

Posebno, svaka vrsta niza ima toObservable () metoda i a doFlowable () metoda:

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

3.1. Izvršljivos

RxKotlin također nudi neke metode za stvaranje Izvršljivo instance. Posebno, možemo pretvoriti Akcijskis, Pozivnos, Budućnosts, i funkcije nulte aritetnosti do Izvršljivo s metodom produženja toCompletable:

var vrijednost = 0 val completable = {value = 3} .toCompletable () assertFalse (completable.test (). isCancelled ()) assertEquals (3, value)

4. Uočljiv i Tekuće do Karta i Multimap

Kad imamo Uočljiv ili Tekuće koji proizvodi Par primjerice, možemo ih pretvoriti u Singl uočljiv koji stvara a Karta:

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

Kao što možemo vidjeti u prethodnom primjeru, toMap prepisuje vrijednosti emitirane ranije s kasnijim vrijednostima ako imaju isti ključ.

Ako želimo prikupiti sve vrijednosti povezane s ključem u zbirku, koristimo naMultimap umjesto toga:

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

5. Kombiniranje Uočljivs i Tekućes

Jedno od prodajnih mjesta Rx-a je mogućnost kombiniranja Uočljivs i Tekućes na razne načine. Zapravo, RxJava nudi brojne operatore izvan okvira.

Uz to, RxKotlin uključuje još nekoliko metoda produženja za kombiniranje Uočljivs i slično.

5.1. Kombinirajući uočljive emisije

Kad imamo Uočljiv koji emitira drugo Uočljivs, možemo koristiti jednu od metoda proširenja u RxKotlinu za kombiniranje emitiranih vrijednosti.

Posebno, spojitiSve kombinira uočljive s flatMap:

val subject = PublishSubject.create() val uočljivo = subject.mergeAll ()

Što bi bilo isto kao:

val uočljiv = subject.flatMap {it}

Dobivena Uočljiv emitirat će sve vrijednosti izvora Uočljivs u nespecificiranom redoslijedu.

Slično tome, concatSve koristi concatMap (vrijednosti se emitiraju istim redoslijedom kao i izvori), dok switchLatest koristi switchMap (vrijednosti se emitiraju iz posljednjeg emitiranog Uočljiv).

Kao što smo do sada vidjeli, predviđene su sve gore navedene metode Tekuće izvori također, s istom semantikom.

5.2. Kombinirajući Izvršljivos,Može bitis, i Singls

Kad imamo Uočljiv koji emitira slučajeve Izvršljivo, Može biti, ili Singl, možemo ih kombinirati s odgovarajućim mergeAllXs metoda poput, na primjer, spajanjeAllMaybes:

val subject = PublishSubject.create() val opservable = subject.mergeAllMaybes () subject.onNext (Maybe.just (1)) subject.onNext (Maybe.just (2)) subject.onNext (Maybe.empty ()) subject.onNext (Maybe.error ( Iznimka ("pogreška"))) subject.onNext (Možda.samo (3)) observable.test (). AssertValues ​​(1, 2) .assertError (Iznimka :: class.java)

5.3. Kombinirajući Iterativs od Uočljivs

Za zbirke Uočljiv ili Tekuće Umjesto toga, RxKotlin ima nekoliko drugih operatora, sjediniti i mergeDelayError. Oboje imaju učinak kombinirajući sve Uočljivs ili Tekućes u onu koja će emitirati sve vrijednosti u nizu:

val observables = mutableListOf (Observable.just ("first", "second")) val observables = observables.merge () observables.add (Observable.just ("third", "4th")) observable.test (). assertValues ("prvi", "drugi", "treći", "četvrti")

Razlika između dva operatora - koja su izravno izvedena od istoimenog operatora u RxJavi - je njihova liječenje pogrešaka.

The sjediniti metoda emitira pogreške čim ih izvor emitira:

// ... observables.add (Observable.error (Exception ("e"))) observables.add (Observable.just ("peti")) // ... observable.test (). assertValues ​​("first" , "drugi", "treći", "četvrti")

Dok mergeDelayError emitira ih na kraju toka:

// ... observables.add (Observable.error (Exception ("e"))) observables.add (Observable.just ("peti")) // ... observable.test (). assertValues ​​("first" , "drugi", "treći", "četvrti", "peti")

6. Rukovanje vrijednostima različitih vrsta

Pogledajmo sada metode produženja u RxKotlinu za bavljenje vrijednostima različitih vrsta.

To su varijante RxJava metoda, koje koriste Kotlinove reificirane generičke lijekove. Konkretno, možemo:

  • emitirati emitirane vrijednosti iz jedne vrste u drugu, ili
  • filtrirati vrijednosti koje nisu određene vrste

Tako bismo, na primjer, mogli baciti Uočljiv od Brojs jednom od Ints:

val observable = Observable.just (1, 1, 2, 3) observable.cast (). test (). assertValues ​​(1, 1, 2, 3)

Ovdje je glumačka postava nepotrebna. Međutim, kad kombiniramo različite vidljive elemente, možda će nam trebati.

S tipa, umjesto toga možemo filtrirati vrijednosti koje nisu tipa koji očekujemo:

val observable = Observable.just (1, "and", 2, "and") observable.ofType (). test (). assertValues ​​(1, 2)

Kao uvijek, cast i ofType primjenjive su na oboje Uočljivs i Tekućes.

Nadalje, Može biti podržava i ove metode. The Singl klasa, umjesto toga, podržava samo cast.

7. Ostale pomoćne metode

Konačno, RxKotlin uključuje nekoliko pomoćnih metoda. Pogledajmo na brzinu.

Možemo koristiti pretplatite seBy umjesto pretplatite se - omogućuje imenovane parametre:

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

Slično tome, za blokiranje pretplata koje možemo koristiti blockingSubscribeBy.

Uz to, RxKotlin uključuje neke metode koje oponašaju one u RxJavi, ali zaobilaze ograničenja Kotlinovog zaključka tipa.

Na primjer, kada se koristi Primjetljiv # zip, navodeći zatvarač ne izgleda tako sjajno:

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

Tako, Dodaje RxKotlin Vidljive # zip za idiomatskiju upotrebu:

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

Primijetite posljednja slova u Vidljive. Slično tome imamo Flowables, samci, i Maybes.

8. Zaključci

U ovom smo članku temeljito pregledali biblioteku RxKotlin koja proširuje RxJavu kako bi njezin API izgledao više poput idiomatskog Kotlina.

Dodatne informacije potražite na stranici RxKotlin GitHub. Za više primjera preporučujemo RxKotlin testove.

Implementacija svih ovih primjera i isječaka koda može se naći u projektu GitHub kao projekt Maven i Gradle, tako da bi ga trebalo biti lako uvesti i pokrenuti kao što jest.


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