Razlika između ravne karte i skretnice u RxJavi

1. Pregled

RxJava nudi razne operatore za pretvaranje predmeta emitiranih od promatranog u druge promatrane. Dva najpopularnija operatora su flatMap i switchMap. Razliku između njih dvoje često je teško razumjeti početnicima u reaktivnom programiranju.

Uvod u RxJavu potražite u ovom članku.

U ovom uputstvu ćemo razumjeti razliku prolazeći kroz jednostavan primjer.

2. flatMap

The flatMap operator pretvara svaku stavku vraćenu iz izvora koji se može posmatrati u neovisni koji se može promatrati pomoću isporučene funkcije, a zatim spaja sve uočljive u jedan vidljivi. Redoslijed spajanja vidljivih nije zajamčen kao da je isti kao u izvoru Uočljiv.

Uzmimo za primjer tražilicu. Uzmite u obzir da rezultate pretraživanja želimo prikazati odmah nakon što upišemo svaki znak riječi:

Radi jednostavnosti, unos upita za pretraživanje uzeli smo kao popis riječi.

Također, uvijek vratimo dva rezultata pretraživanja za svaku riječ.

// zadani Popis actualOutput = new ArrayList (); TestScheduler planer = novi TestScheduler (); Popis ključnih riječiToSearch = Arrays.asList ("b", "bo", "boo", "book", "books"); // kada je Observable.fromIterable (keywordToSearch) .flatMap (s -> Observable.just (s + "FirstResult", s + "SecondResult") .delay (10, TimeUnit.SECONDS, planer)) .toList () .doOnSuccess ( s -> actualOutput.addAll (s)) .subscribe (); planer.advanceTimeBy (1, TimeUnit.MINUTES); // zatim assertThat (actualOutput, hasItems ("b FirstResult", "b SecondResult", "boo FirstResult", "boo SecondResult", "bo FirstResult", "bo SecondResult", "book FirstResult", "book SecondResult", " knjige FirstResult "," knjige SecondResult "));

Imajte na umu da redoslijed nije uvijek isti kod svakog izvođenja.

3. switchMap

The switchMap operator sličan je flatMap, osim što zadržava rezultat samo najnovijeg vidljivog, odbacujući prethodne.

Promijenimo svoj zahtjev u tome da želimo dobiti rezultate pretraživanja samo za konačnu potpuno oblikovanu riječ (u ovom slučaju, "knjige"), a ne za djelomične nizove upita. Da bismo to postigli, možemo koristiti switchMap.

Ako samo zamijenimo flatMap s switchMap u gornjem primjeru koda vrijedile bi sljedeće tvrdnje:

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

Kao što ovdje vidimo, dobili smo samo jedan vidljivi koji sadrži najnoviju ulaznu stavku iz izvornog vidljivog. Svi prethodni rezultati su odbačeni.

4. Zaključak

Sažeti, switchMap razlikuje se od flatMap u tome što zadržava samo rezultat primjene pružene funkcije na najnoviju stavku koju je emitirao izvor Observable, flatMap, s druge strane, zadržava sve rezultate i vraća ih isprepleteno bez jamstva reda.

Kao i uvijek, kôd korišten u ovom članku dostupan je na GitHub-u.


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