Rozdiel medzi Flatmapou a Switchmapou v RxJava

1. Prehľad

RxJava poskytuje rôzne operátory na transformáciu položiek emitovaných pozorovateľnou do iných pozorovateľných. Dvaja z najpopulárnejších operátorov sú flatMap a switchMap. Rozdiel medzi nimi je pre začiatočníkov pri reaktívnom programovaní často ťažko pochopiteľný.

Úvod do RxJava nájdete v tomto článku.

V tomto tutoriále pochopíme rozdiel tým, že si ukážeme jednoduchý príklad.

2. flatMap

The flatMap operátor konvertuje každú položku vrátenú zo zdroja pozorovateľného na nezávislý pozorovateľný pomocou dodanej funkcie a potom zlúči všetky pozorovateľné objekty do jedného pozorovateľného. Nie je zaručené, že poradie zlúčenia pozorovateľných údajov bude rovnaké ako v zdroji Pozorovateľné.

Zoberme si ako príklad vyhľadávač. Zvážte, že chceme zobraziť výsledky hľadania okamžite po zadaní každého znaku slova:

Pre jednoduchosť sme vstup hľadaného dotazu brali ako zoznam slov.

Pre každé slovo tiež vždy vrátime dva výsledky vyhľadávania.

// daný Zoznam actualOutput = nový ArrayList (); Plánovač TestScheduler = nový TestScheduler (); Zoznam kľúčových slovToSearch = Arrays.asList ("b", "bo", "boo", "kniha", "knihy"); // when Observable.fromIterable (keywordToSearch) .flatMap (s -> Observable.just (s + "FirstResult", s + "SecondResult") .delay (10, TimeUnit.SECONDS, scheduler)) .toList () .doOnSuccess ( s -> actualOutput.addAll (s)) .subscribe (); scheduler.advanceTimeBy (1, TimeUnit.MINUTES); // potom assertThat (actualOutput, hasItems ("b FirstResult", "b SecondResult", "boo FirstResult", "boo SecondResult", "bo FirstResult", "bo SecondResult", "kniha FirstResult", "kniha SecondResult", " books FirstResult "," books SecondResult "));

Upozorňujeme, že poradie nie je vždy rovnaké pri každom spustení.

3. switchMap

The switchMap operátor je podobný flatMap, až na to, že si ponechá výsledok iba posledných pozorovateľných, vyradí predchádzajúce.

Zmeňme našu požiadavku v tom, že chceme získať výsledky hľadania iba pre posledné úplne vytvorené slovo (v tomto prípade „knihy“), a nie pre reťazce čiastkových dotazov. Aby sme to dosiahli, môžeme použiť switchMap.

Keby sme len vymenili flatMap s switchMap vo vyššie uvedenom príklade kódu by boli platné nasledujúce tvrdenia:

assertEquals (2, actualOutput.size ()); assertThat (actualOutput, hasItems ("books FirstResult", "books SecondResult"));

Ako vidíme tu, dostali sme iba jeden pozorovateľný obsahujúci najnovšiu vstupnú položku zo zdroja pozorovateľného. Všetky predchádzajúce výsledky boli zahodené.

4. Záver

Zhrnúť, switchMap sa líši od flatMap v tom, že si zachováva iba výstup uplatnenia poskytnutej funkcie na najnovšiu položku emitovanú zdrojom Observable, flatMap, na druhej strane zachováva všetky výsledky a vracia ich prekladaným spôsobom bez zaručenia poradia.

Ako vždy, kód použitý v tomto článku je k dispozícii na GitHub.