Rozdiel medzi mapou () a flatMap ()

1. Prehľad

mapa () a flatMap () API vychádzajú z funkčných jazykov. V prostredí Java 8 ich nájdete v Voliteľné, stream a v CompletableFuture (hoci pod trochu iným menom).

Prúdy predstavujú postupnosť objektov, zatiaľ čo voliteľné sú triedy, ktoré predstavujú hodnotu, ktorá môže byť prítomná alebo neprítomná. Medzi ďalšie agregované operácie patrí mapa () a flatMap () metódy.

Napriek tomu, že oba majú rovnaké návratové typy, sú dosť odlišné. Poďme si tieto rozdiely vysvetliť analýzou niektorých príkladov streamov a voliteľných doplnkov.

2. Mapa a Flatmap vo voliteľnom vybavení

The mapa () metóda funguje dobre s Voliteľné - ak funkcia vráti presný typ, ktorý potrebujeme:

Voliteľné s = Optional.of ("test"); assertEquals (Optional.of ("TEST"), s.map (String :: toUpperCase));

V zložitejších prípadoch by nám však mohla byť poskytnutá funkcia, ktorá vráti znak Voliteľné tiež. V takýchto prípadoch použitie mapa () by viedlo k vnorenej štruktúre, pretože mapa () implementácia robí ďalšie zabalenie interne.

Pozrime sa na ďalší príklad na lepšie pochopenie tejto situácie:

assertEquals (Optional.of (Optional.of ("STRING")), Optional .of ("string") .map (s -> Optional.of ("STRING")));

Ako vidíme, skončíme pri vnorenej štruktúre Voliteľné. Aj keď to funguje, jeho použitie je dosť ťažkopádne a nezabezpečuje žiadnu ďalšiu nulovú bezpečnosť, takže je lepšie udržiavať rovnú štruktúru.

To je presne to flatMap () pomáha nám robiť:

assertEquals (Optional.of ("STRING"), Optional .of ("string") .flatMap (s -> Optional.of ("STRING")));

3. Mapa a plochá mapa v prúdoch

Obe metódy fungujú podobne Voliteľné.

The mapa () metóda zalomí podkladovú sekvenciu do a Prúd napríklad, keďže flatMap () metóda umožňuje vyhnúť sa vnoreným Prúd štruktúra.

V nasledujúcom príklade mapa () vyrába a Prúd pozostávajúci z výsledkov uplatňovania toUpperCase () metóda k prvkom vstupu Prúd:

Zoznam myList = Stream.of ("a", "b") .map (String :: toUpperCase) .collect (Collectors.toList ()); assertEquals (asList ("A", "B"), myList);

mapa () v takomto jednoduchom prípade funguje celkom dobre, ale čo ak máme ako vstup niečo zložitejšie, napríklad zoznam zoznamov.

Pozrime sa, ako to funguje:

Zoznam list = Arrays.asList (Arrays.asList ("a"), Arrays.asList ("b")); System.out.println (zoznam);

Tento úryvok vytlačí zoznam zoznamov [[a], [b]].

Teraz použijeme a flatMap ():

System.out.println (list .stream () .flatMap (Collection :: stream) .collect (Collectors.toList ()));

Výsledok takéhoto úryvku sa vyrovná [a, b].

Ton flatMap () metóda najskôr vyrovná vstup Prúd z Prúdy do a Prúd z Struny (viac o sploštení nájdete v článku). Potom to funguje podobne ako v mapa () metóda.

4. Záver

Java 8 nám dáva príležitosť používať mapa () a flatMap () metódy, ktoré sa pôvodne používali vo funkčných jazykoch.

Môžeme ich vyvolať ďalej Prúdy a voliteľné. Tieto metódy nám pomáhajú získať mapované objekty pomocou poskytnutej mapovacej funkcie.

Ako vždy, môžete si pozrieť príklady uvedené v tomto článku na stránkach GitHub.


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