Forskjellen mellom kart () og flatMap ()

1. Oversikt

kart() og flatMap () API-er stammer fra funksjonelle språk. I Java 8 kan du finne dem i Valgfritt, Stream og i Fullførbar fremtid (selv om under litt annet navn).

Strømmer representerer en sekvens av objekter, mens valgfrie er klasser som representerer en verdi som kan være til stede eller fraværende. Blant andre samlede operasjoner har vi kart() og flatMap () metoder.

Til tross for at begge har de samme returtypene, de er ganske forskjellige. La oss forklare disse forskjellene ved å analysere noen eksempler på strømmer og valgfrie.

2. Kart og Flatmap i Tilvalg

De kart() metoden fungerer bra med Valgfri - hvis funksjonen returnerer den nøyaktige typen vi trenger:

Valgfritt s = Optional.of ("test"); assertEquals (Optional.of ("TEST"), s.map (String :: toUpperCase));

I mer komplekse tilfeller kan vi imidlertid få en funksjon som returnerer en Valgfri også. I slike tilfeller bruker kart() ville føre til en nestet struktur, som kart() implementering gjør en ekstra innpakning internt.

La oss se et annet eksempel for å få en bedre forståelse av denne situasjonen:

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

Som vi ser, ender vi opp med den nestede strukturen Valgfri. Selv om det fungerer, er det ganske tungvint å bruke og gir ingen ekstra null-sikkerhet, så det er bedre å holde en flat struktur.

Det er akkurat det flatMap () hjelper oss å gjøre:

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

3. Kart og Flatmap i bekker

Begge metodene fungerer på samme måte for Valgfri.

De kart() metoden bryter den underliggende sekvensen i en Strøm eksempel, mens flatMap () metoden gjør det mulig å unngå nestet Strøm struktur.

I det følgende eksemplet, kart() produserer en Strøm som består av resultatene av å bruke toUpperCase () metoden til elementene i inngangen Strøm:

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

kart() fungerer ganske bra i en så enkel sak, men hva om vi har noe mer komplekst som en liste over lister som innspill.

La oss se hvordan det fungerer:

Liste liste = Arrays.asList (Arrays.asList ("a"), Arrays.asList ("b")); System.out.println (liste);

Denne kodebiten skriver ut en liste med lister [[a], [b]].

La oss nå bruke en flatMap ():

System.out.println (liste .stream () .flatMap (Samling :: stream) .collect (Collectors.toList ()));

Resultatet av et slikt utdrag blir flatt til [a, b].

Than flatMap () metoden flater først inngangen Strøm av Strømmer til en Strøm av Strenger (for mer informasjon om utflating, se artikkelen). Deretter fungerer det på samme måte som kart() metode.

4. Konklusjon

Java 8 gir oss muligheten til å bruke kart() og flatMap () metoder som opprinnelig ble brukt på funksjonelle språk.

Vi kan påberope dem videre Strømmer og ekstrautstyr. Disse metodene hjelper oss å få kartlagte objekter ved å bruke den medfølgende kartleggingsfunksjonen.

Som alltid kan du sjekke eksemplene i denne artikkelen på GitHub.


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