Különbség a Flatmap és a Switchmap között az RxJava-ban

1. Áttekintés

Az RxJava különféle operátorokat biztosít arra, hogy a megfigyelhető által kibocsátott elemeket más megfigyelhetővé alakítsák át. A legnépszerűbb operátorok közül kettő flatMap és switchMap. A reaktív programozás kezdőinek gyakran nehéz megérteni a kettő közötti különbséget.

Az RxJava bemutatásához olvassa el ezt a cikket.

Ebben az oktatóanyagban egy egyszerű példán keresztül megértjük a különbséget.

2. flatMap

A flatMap az operátor minden megfigyelhető forrásból visszaküldött elemet a mellékelt függvény segítségével független megfigyelhetővé alakít, majd az összes megfigyelhetőt egyetlen megfigyelhetővé egyesíti. A megfigyelhető elemek egyesítésének sorrendje nem garantáltan ugyanaz, mint a forrásban Megfigyelhető.

Vegyünk példaként egy keresőmotort. Fontolja meg, hogy azonnal meg akarjuk jeleníteni a keresési eredményeket, miután beírtuk a szó minden karakterét:

Az egyszerűség kedvéért a keresési lekérdezés bevitelét szavak listájának vettük.

Ezenkívül mindig két keresési eredményt adunk vissza minden szóhoz.

// adott List actualOutput = new ArrayList (); TestScheduler ütemező = új TestScheduler (); List keywordToSearch = Arrays.asList ("b", "bo", "boo", "könyv", "könyvek"); // amikor Observable.fromIterable (keywordToSearch) .flatMap (s -> Observable.just (s + "FirstResult", s + "SecondResult") .delay (10, TimeUnit.SECONDS, ütemező)) .toList () .doOnSuccess ( s -> actualOutput.addAll (s)) .subscribe (); scheduler.advanceTimeBy (1, TimeUnit.MINUTES); // majd assertThat (actualOutput, hasItems ("b FirstResult", "b SecondResult", "boo FirstResult", "boo SecondResult", "bo FirstResult", "bo SecondResult", "book FirstResult", "book SecondResult", " könyvek FirstResult "," könyvek SecondResult "));

Felhívjuk figyelmét, hogy a sorrend nem mindig ugyanaz minden futásnál.

3. switchMap

A switchMap operátor hasonló flatMap, azzal a különbséggel, hogy megőrzi csak a legfrissebb megfigyelhető eredményét, elvetve az előzőeket.

Változtassunk a követelményünkön annyiban, hogy csak a végső, teljesen kialakított szóra (ebben az esetben a „könyvek”) akarunk keresési eredményeket kapni, és nem a részleges lekérdezési karakterláncokra. Ennek elérésére felhasználhatjuk switchMap.

Ha csak cseréljük flatMap val vel switchMap a fenti kód példában a következő állítások lennének érvényesek:

assertEquals (2, actualOutput.size ()); assertThat (actualOutput, hasItems ("könyvek FirstResult", "könyvek SecondResult"));

Amint itt látjuk, csak egyetlen megfigyelhetőt kaptunk, amely tartalmazza a megfigyelhető forrás legfrissebb bemeneti elemét. Minden korábbi eredményt elvetettünk.

4. Következtetés

Összefoglalni, switchMap különbözik flatMap annyiban, hogy csak a Megfigyelhető forrás által kibocsátott legfrissebb elemre vonatkoztatva biztosítja a megadott funkciók kimenetét, flatMapmásrészt megtartja az összes eredményt, és egymásba illesztve adja vissza a rend garantálása nélkül.

Mint mindig, az ebben a cikkben használt kód elérhető a GitHubon.