Forskellen mellem Flatmap og Switchmap i RxJava

1. Oversigt

RxJava giver forskellige operatører til at omdanne genstande udsendt af en observerbar til andre observerbare. To af de mest populære operatører er flatMap og switchMap. Forskellen mellem de to er ofte svær at forstå for begyndere i reaktiv programmering.

For en introduktion til RxJava henvises til denne artikel.

I denne vejledning forstår vi forskellen ved at gå gennem et simpelt eksempel.

2. flatMap

Det flatMap operatør konverterer hvert element, der returneres fra en kilde, der kan observeres, til en uafhængig observerbar ved hjælp af den leverede funktion og fletter derefter alle de observerbare i en enkelt observerbar. Den rækkefølge, hvori observerbare observationer flettes, garanteres ikke at være den samme som i kilden Observerbar.

Lad os tage en søgemaskine som et eksempel. Overvej at vi vil vise søgeresultater umiddelbart efter vi har indtastet hvert tegn i ordet:

For enkelheds skyld har vi taget søgeforespørgselindgangen som en ordliste.

Vi returnerer også altid to søgeresultater for hvert ord.

// given List actualOutput = new ArrayList (); TestScheduler scheduler = ny TestScheduler (); Liste over 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); // derefter assertThat (actualOutput, hasItems ("b FirstResult", "b SecondResult", "boo FirstResult", "boo SecondResult", "bo FirstResult", "bo SecondResult", "book FirstResult", "book SecondResult", " bøger FirstResult "," books SecondResult "));

Bemærk, at ordren ikke altid er den samme ved hver kørsel.

3. switchMap

Det switchMap operatøren ligner flatMap, bortset fra at det kun bevarer resultatet af det seneste, der kan observeres, og kasserer de foregående.

Lad os ændre vores krav, idet vi kun ønsker at få søgeresultater til det endelige fuldt udformede ord (i dette tilfælde "bøger") og ikke til de delvise forespørgselsstrenge. For at opnå dette kan vi bruge switchMap.

Hvis vi bare erstatter flatMap med switchMap i ovenstående kodeeksempel ville følgende påstande være gyldige:

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

Som vi ser her, fik vi kun en enkelt observerbar indeholdende det seneste inputelement fra den observerbare kilde. Alle tidligere resultater blev kasseret.

4. Konklusion

At opsummere, switchMap adskiller sig fra flatMap ved at det kun bevarer output fra at anvende en forudsat funktion til det seneste emne, der udsendes af kilden Observerbar, flatMappå den anden side bevarer alle resultater og returnerer dem på en sammenflettet måde uden at garantere orden.

Som altid er koden, der bruges i denne artikel, tilgængelig på GitHub.