Forskjellen mellom flatmap og switchmap i RxJava

1. Oversikt

RxJava tilbyr forskjellige operatører til å transformere gjenstander som sendes ut av en observerbar til andre observerbare. To av de mest populære operatørene er flatMap og switchMap. Forskjellen mellom de to er ofte vanskelig å forstå for nybegynnere i reaktiv programmering.

For en introduksjon til RxJava, se denne artikkelen.

I denne opplæringen vil vi forstå forskjellen ved å gå gjennom et enkelt eksempel.

2. flatMap

De flatMap operatøren konverterer hvert element som returneres fra en kilde som kan observeres, til en uavhengig observerbar ved hjelp av den medfølgende funksjonen, og slår deretter sammen alle observerbare ting til en eneste observerbar. Rekkefølgen som observerbare ting slås sammen, er garantert ikke den samme som i kilden Observerbar.

La oss ta en søkemotor som et eksempel. Tenk på at vi vil vise søkeresultater umiddelbart etter at vi har skrevet inn hvert tegn i ordet:

For enkelhets skyld har vi tatt med søkeordet som en liste over ord.

Vi returnerer alltid to søkeresultater for hvert ord.

// gitt Liste actualOutput = ny ArrayList (); TestScheduler scheduler = ny TestScheduler (); Liste keywordToSearch = Arrays.asList ("b", "bo", "boo", "book", "books"); // når Observable.fromIterable (keywordToSearch) .flatMap (s -> Observable.just (s + "FirstResult", s + "SecondResult"). Delay (10, TimeUnit.SECONDS, scheduler)) .toList () .doOnSuccess ( s -> actualOutput.addAll (s)). abonner (); scheduler.advanceTimeBy (1, TimeUnit.MINUTES); // deretter assertThat (actualOutput, hasItems ("b FirstResult", "b SecondResult", "boo FirstResult", "boo SecondResult", "bo FirstResult", "bo SecondResult", "book FirstResult", "book SecondResult", " bøker FirstResult "," books SecondResult "));

Vær oppmerksom på at bestillingen ikke alltid er den samme for hvert løp.

3. switchMap

De switchMap operatøren er lik flatMap, bortsett fra at den beholder resultatet av bare det siste som kan observeres, og forkaster de forrige.

La oss endre kravet vårt ved at vi ønsker å få søkeresultater for bare det endelige fullformede ordet (i dette tilfellet "bøker") og ikke for delstrengene. For å oppnå dette kan vi bruke switchMap.

Hvis vi bare bytter ut flatMap med switchMap i ovennevnte kodeeksempel, vil følgende påstander være gyldige:

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

Som vi ser her, har vi bare en eneste observerbar som inneholder den siste innspillingen fra kilden som kan observeres. Alle tidligere resultater ble kastet.

4. Konklusjon

Å oppsummere, switchMap skiller seg fra flatMap ved at den bare beholder utdataene fra å bruke en gitt funksjon til det siste elementet som sendes ut av kilden Observable, flatMapderimot, beholder alle resultatene og returnerer dem på en sammenflettet måte uten å garantere orden.

Som alltid er koden som brukes i denne artikkelen tilgjengelig på GitHub.


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