Verschil tussen Flatmap en Switchmap in RxJava

1. Overzicht

RxJava biedt verschillende operators om items die worden uitgezonden door een observeerbaar om te zetten in andere observeerbare items. Twee van de meest populaire operators zijn flatMap en switchMap. Het verschil tussen de twee is vaak moeilijk te begrijpen voor beginners in reactief programmeren.

Raadpleeg dit artikel voor een inleiding tot RxJava.

In deze tutorial zullen we het verschil begrijpen door een eenvoudig voorbeeld te doorlopen.

2. flatMap

De flatMap operator zet elk item dat wordt geretourneerd van een waarneembare bron om in een onafhankelijk waarneembaar item met behulp van de geleverde functie en voegt vervolgens alle waarneembare items samen in een enkel waarneembaar item. De volgorde waarin observabelen worden samengevoegd, is niet gegarandeerd dezelfde als in de bron Waarneembaar.

Laten we een zoekmachine als voorbeeld nemen. Bedenk dat we zoekresultaten onmiddellijk willen weergeven nadat we elk teken van het woord hebben getypt:

Omwille van de eenvoud hebben we de invoer van de zoekopdracht als een lijst met woorden genomen.

We retourneren ook altijd twee zoekresultaten voor elk woord.

// gegeven lijst actualOutput = nieuwe ArrayList (); TestScheduler scheduler = nieuwe TestScheduler (); List keywordToSearch = Arrays.asList ("b", "bo", "boo", "book", "books"); // when Observable.fromIterable (keywordToSearch) .flatMap (s -> Observable.just (s + "FirstResult", s + "SecondResult") .delay (10, TimeUnit.SECONDS, planner)) .toList () .doOnSuccess ( s -> actualOutput.addAll (s)) .subscribe (); scheduler.advanceTimeBy (1, TimeUnit.MINUTES); // then assertThat (actualOutput, hasItems ("b FirstResult", "b SecondResult", "boo FirstResult", "boo SecondResult", "bo FirstResult", "bo SecondResult", "book FirstResult", "book SecondResult", " books FirstResult "," books SecondResult "));

Houd er rekening mee dat de volgorde niet altijd hetzelfde is bij elke run.

3. switchMap

De switchMap operator lijkt op flatMap, behalve dat het het resultaat van alleen de laatste waarneembare behoudt, waarbij de vorige worden weggegooid.

Laten we onze eis wijzigen in die zin dat we zoekresultaten willen krijgen voor alleen het laatste volledig gevormde woord (in dit geval "boeken") en niet voor de gedeeltelijke zoektermen. Om dit te bereiken kunnen we gebruik maken van switchMap.

Als we gewoon vervangen flatMap met switchMap in het bovenstaande codevoorbeeld zijn de volgende beweringen geldig:

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

Zoals we hier zien, hebben we slechts één waarneembaar item met het laatste invoeritem van de waarneembare bron. Alle eerdere resultaten zijn weggegooid.

4. Conclusie

Samenvatten, switchMap is anders dan flatMap in die zin dat het alleen de uitvoer behoudt van het toepassen van een verstrekte functie op het laatste item dat is uitgezonden door de bron Waarneembaar, flatMapaan de andere kant behoudt alle resultaten en retourneert ze op een interleaved manier zonder de volgorde te garanderen.

Zoals altijd is de code die in dit artikel wordt gebruikt, beschikbaar op GitHub.