Az RxKotlin bemutatása

1. Áttekintés

Ebben az oktatóanyagban áttekintjük a Reaktív kiterjesztések (Rx) idiomatikus Kotlinban az RxKotlin könyvtár segítségével.

Az RxKotlin önmagában nem a reaktív kiterjesztések megvalósítása. Ehelyett leginkább kiterjesztési módszerek gyűjteménye. Vagyis az RxKotlin növeli a RxJava könyvtár Kotlin szem előtt tartásával tervezett API-val.

Ezért az RxJava bevezetése című cikkünk fogalmait, valamint a Folyékony egy dedikált cikkben mutattuk be.

2. Az RxKotlin beállítása

Az RxKotlin használatához a Maven projektben hozzá kell adnunk a rxkotlin függőség a mi pom.xml:

 io.reactivex.rxjava2 rxkotlin 2.3.0 

Vagy egy Gradle projektnél a miénk build.gradle:

megvalósítás 'io.reactivex.rxjava2: rxkotlin: 2.3.0'

Itt az RxKotlin 2.x-et használjuk, amely az RxJava 2-t célozza meg. Az RxJava 1-et használó projekteknek az RxKotlin 1.x-et kell használniuk. Mindkét változatra ugyanazok a fogalmak vonatkoznak.

Ne feledje, hogy az RxKotlin az RxJavától függ, de nem frissítik a függőséget gyakran a legújabb kiadásra. Tehát javasoljuk, hogy kifejezetten foglalja bele azt a konkrét RxJava verziót, amelyen függünk, amint azt az RxJava cikkünk részletezi.

3. Teremtés Megfigyelhetős az RxKotlinban

Az RxKotlin számos kiterjesztési módszert tartalmaz a létrehozáshoz Megfigyelhető és Folyékony tárgyak gyűjteményekből.

Különösen, minden típusú tömbnek van egy megfigyelhető () módszer és a toflowable () módszer:

val megfigyelhető = listOf (1, 1, 2, 3). Megfigyelhető () megfigyelhető. teszt (). 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. Teljess

Az RxKotlin néhány módszert is kínál a létrehozáshoz Teljes példányok. Különösen, konvertálhatunk Akciós, Hívhatós, Jövős, és nulla aritású függvények Teljes a kiterjesztési módszerrel toCompletable:

var érték = 0 val teljesíthető = {érték = 3} .toCompletable () assertFalse (teljes.teszt (). isCancelled ()) assertEquals (3, érték)

4. Megfigyelhető és Folyékony nak nek Térkép és Multimap

Amikor van egy Megfigyelhető vagy Folyékony hogy termel Pár példányok, átalakíthatjuk őket a Egyetlen megfigyelhető, amely a Térkép:

val list = listOf (Pár ("a", 1), Páros ("b", 2), Páros ("c", 3), Pár ("a", 4)) val megfigyelhető = list.toObservable () val map = observable.toMap () assertEquals (mapOf (Pár ("a", 4), Pár ("b", 2), Páros ("c", 3)), map.blockingGet ())

Ahogy az előző példában láthatjuk, térképre felülírja a korábban kibocsátott értékeket a későbbi értékekkel, ha ugyanazzal a kulccsal rendelkeznek.

Ha egy kulcshoz tartozó összes értéket fel akarjuk gyűjteni egy gyűjteménybe, akkor azt használjuk toMultimap helyette:

val list = listOf (Pár ("a", 1), Páros ("b", 2), Páros ("c", 3), Pár ("a", 4)) val megfigyelhető = list.toObservable () val map = observable.toMultimap () assertEquals (mapOf (Pár ("a", listOf (1, 4)), Pár ("b", listOf (2)), Páros ("c", listOf (3)), map.blockingGet ())

5. Kombinálás Megfigyelhetős és Folyékonys

Az Rx egyik értékesítési pontja a kombinálás lehetősége Megfigyelhetős és Folyékonys különféle módokon. Az RxJava valóban számos operátort kínál ki a dobozból.

Ezen felül az RxKotlin tartalmaz még néhány kiterjesztési módszert a kombináláshoz Megfigyelhetős hasonlók.

5.1. Megfigyelhető kibocsátások kombinálása

Amikor van egy Megfigyelhető ami másokat bocsát ki Megfigyelhetős, használhatjuk az RxKotlin egyik kiterjesztési módszerét a kibocsátott értékek egyesítésére.

Különösen, mergeAll a megfigyelhetőeket egyesíti a flatMap:

val subject = PublishSubject.create() val megfigyelhető = subject.mergeAll ()

Ami azonos lenne:

val megfigyelhető = subject.flatMap {it}

A kapott Megfigyelhető kibocsátja a forrás összes értékét Megfigyelhetős nem meghatározott sorrendben.

Hasonlóképpen, concatAll használ concatMap (az értékeket ugyanabban a sorrendben bocsátják ki, mint a forrásokat), míg switchLatest használ switchMap (az értékeket az utoljára kibocsátott értékek adják ki Megfigyelhető).

Ahogy eddig láttuk, a fenti módszerek mindegyike rendelkezésre áll Folyékony források is, ugyanazzal a szemantikával.

5.2. Kombinálás Teljess,Taláns és Egyetlens

Amikor van egy Megfigyelhető amely példányokat bocsát ki Teljes, Talán, vagy Egyetlen, ezeket kombinálhatjuk a megfelelővel mergeAllXs módszer, például mergeAllMaybes:

val subject = PublishSubject.create() val megfigyelhető = subject.mergeAllMaybes () subject.onNext (Talán.csak (1)) subject.onNext (Talán.csak (2)) subject.onNext (Talán. üres ()) subject.onNext (Lehetséges.hiba ( Kivétel ("hiba")))) subject.onNext (Talán.egyszerűen (3)) megfigyelhető.teszt (). AssertValues ​​(1, 2) .assertError (Kivétel :: class.java)

5.3. Kombinálás Iterálhatós Megfigyelhetős

Gyűjtemények Megfigyelhető vagy Folyékony példányok helyett az RxKotlin-nak van néhány más operátora, összeolvad és mergeDelayError. Mindkettőnek az a hatása egyesítve az összes Megfigyelhetős vagy Folyékonys egybe, amely az összes értéket egymás után adja ki:

val observable = mutableListOf (Observable.just ("first", "second")) val observable = observables.merge () observables.add (Observable.just ("harmadik", "negyedik")) observable.test (). assertValues ("első második harmadik negyedik")

A két operátor közötti különbség - amelyek közvetlenül az azonos nevű operátoroktól származnak az RxJava-ban - az ő a hibák kezelése.

A összeolvad A módszer hibákat bocsát ki, amint a forrás kiadja őket:

// ... observables.add (Observable.error (Exception ("e"))) observables.add (Observable.just ("ötödik")) // ... observable.test (). assertValues ​​("first" , "második", "harmadik", "negyedik")

Mivel mergeDelayError a patak végén bocsátja ki őket:

// ... observables.add (Observable.error (Exception ("e"))) observables.add (Observable.just ("ötödik")) // ... observable.test (). assertValues ​​("first" , "második", "harmadik", "negyedik", "ötödik")

6. Különböző típusú értékek kezelése

Most nézzük meg az RxKotlin kiterjesztési módszereit a különböző típusú értékek kezelésére.

Ezek az RxJava módszerek változatai, amelyek felhasználják Kotlin reifikált generikumait. Különösen:

  • leadja a kibocsátott értékeket egyik típusból a másikba, vagy
  • szűrje ki azokat az értékeket, amelyek nem egy bizonyos típusúak

Tehát például dobhatnánk egy Megfigyelhető nak,-nek Száms az egyikhez Ints:

val megfigyelhető = Megfigyelhető. csak (1, 1, 2, 3) megfigyelhető. közvetítés (). teszt (). assertValues ​​(1, 1, 2, 3)

Itt a szereposztás felesleges. A különféle megfigyelhető elemek kombinálásakor azonban szükségünk lehet rá.

Val vel ofType, ehelyett kiszűrhetjük azokat az értékeket, amelyek nem az általunk várt típusúak:

val megfigyelhető = Observable.just (1, "és", 2, "és") observable.ofType (). test (). assertValues ​​(1, 2)

Mint mindig, öntvény és ofType mindkettőre alkalmazhatók Megfigyelhetős és Folyékonys.

Továbbá, Talán támogatja ezeket a módszereket is. A Egyetlen osztály ehelyett csak támogatja öntvény.

7. Egyéb segítő módszerek

Végül az RxKotlin számos segítő módszert tartalmaz. Vessünk egy gyors pillantást.

Tudjuk használni feliratkozás ahelyett Iratkozz fel - megengedi a megnevezett paramétereket:

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

Hasonlóképpen, az előfizetés blokkolásához használhatjuk blockingSubscribeBy.

Ezenkívül az RxKotlin tartalmaz néhány módszert, amelyek utánozzák az RxJava-ban lévőket, de kiküszöbölik a Kotlin-féle következtetés korlátozását.

Például a használatakor Megfigyelhető # zip, megadva a cipzár nem néz ki olyan nagyszerűen:

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

Így, RxKotlin hozzáteszi Megfigyelhető # zip idiomatikusabb használatra:

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

Figyelje meg a végső “s” -t Megfigyelhetők. Hasonlóképpen van Folyékony, egyedülálló, és Maybes.

8. Következtetések

Ebben a cikkben alaposan áttekintettük az RxKotlin könyvtárat, amely kibővíti az RxJava-t, hogy az API jobban hasonlítson az idiomatikus Kotlinra.

További információkért kérjük, olvassa el az RxKotlin GitHub oldalt. További példákért javasoljuk az RxKotlin teszteket.

Ezeknek a példáknak és kódrészleteknek a megvalósítása megtalálható a GitHub projektben Maven és Gradle projektként, ezért könnyen importálhatónak és futtathatónak kell lennie.