A térkép () és a flatMap () közötti különbség

1. Áttekintés

térkép() és flatMap () Az API-k funkcionális nyelvekből származnak. A Java 8-ban ezeket megtalálhatja Választható, Stream és be CompletableFuture (bár kissé más néven).

Patakok objektumok sorrendjét képviselik, míg az opcionálisok olyan osztályok, amelyek jelen lévő vagy hiányzó értéket képviselnek. Egyéb összesített műveletek mellett megvan a térkép() és flatMap () mód.

Annak ellenére, hogy mindkettőnek ugyanaz a visszatérési típusa, egészen mások. Magyarázzuk el ezeket a különbségeket a folyamok és opciók néhány példájának elemzésével.

2. Térkép és síktérkép az opcionálisokban

A térkép() módszer jól működik Választható - ha a függvény pontosan megadja a szükséges típust:

Opcionális s = Opcionális. ("Teszt"); assertEquals (Opcionális.of ("TEST"), s.map (String :: toUpperCase));

Bonyolultabb esetekben azonban kaphatunk egy függvényt, amely visszaadja az Választható is. Ilyen esetekben a térkép() beágyazott struktúrához vezetne, mivel a térkép() a megvalósítás további csomagolást végez belsőleg.

Nézzünk meg egy másik példát, hogy jobban megértsük ezt a helyzetet:

assertEquals (Opcionális. (Opcionális. ("STRING")), Opcionális. ("Karaktersorozat"). térkép (s -> Opcionális. ("STRING")));

Mint láthatjuk, a beágyazott struktúrához jutunk Választható. Bár működik, elég nehézkes használni, és nem nyújt semmilyen további null-biztonságot, ezért jobb, ha egy lapos szerkezetet tartunk.

Pontosan ez az flatMap () segít nekünk:

assertEquals (Opcionális. ("STRING"), Opcionális.

3. Térkép és laptérkép a patakokban

Mindkét módszer hasonlóan működik Választható.

A térkép() módszer beburkolja az alapul szolgáló szekvenciát a Folyam például, míg a flatMap () módszer lehetővé teszi a beágyazódások elkerülését Folyam szerkezet.

A következő példában térkép() előállítja a Folyam a. alkalmazásának eredményeiből áll toUpperCase () módszer a bemenet elemeihez Folyam:

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

térkép() nagyon jól működik ilyen egyszerű esetben, de mi van, ha van valami összetettebb dolog, például bemenetként listák listája.

Nézzük meg, hogyan működik:

Lista list = Tömbök.asList (Tömbök.asList ("a"), Tömbök.asList ("b")); System.out.println (lista);

Ez a kódrészlet kinyomtatja a listák listáját [[a], [b]].

Most használjuk a flatMap ():

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

Egy ilyen részlet eredménye lapos lesz [a, b].

Tő flatMap () módszer először lapítja a bemenetet Folyam nak,-nek Patakok a Folyam nak,-nek Húrok (a lapítással kapcsolatban lásd a cikket). Ezt követően hasonlóan működik, mint a térkép() módszer.

4. Következtetés

A Java 8 lehetőséget ad a térkép() és flatMap () eredetileg funkcionális nyelvekben használt módszerek.

Felhívhatjuk őket tovább Patakok és Opcionális. Ezek a módszerek segítenek abban, hogy leképezett objektumokat kapjunk a megadott leképezési függvény alkalmazásával.

Mint mindig, itt is megnézheti a cikkben található példákat a GitHubon.