Forskellen mellem kort () og flatMap ()

1. Oversigt

kort() og flatMap () API'er stammer fra funktionelle sprog. I Java 8 kan du finde dem i Valgfrit, Stream og i CompletableFuture (skønt under lidt andet navn).

Strømme repræsenterer en sekvens af objekter, mens valgfri er klasser, der repræsenterer en værdi, der kan være til stede eller fraværende. Blandt andre samlede operationer har vi kort() og flatMap () metoder.

På trods af at begge har de samme returtyper, de er ret forskellige. Lad os forklare disse forskelle ved at analysere nogle eksempler på streams og optionals.

2. Kort og Flatmap i ekstraudstyr

Det kort() metode fungerer godt med Valgfri - hvis funktionen returnerer den nøjagtige type, vi har brug for:

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

I mere komplekse tilfælde får vi dog en funktion, der returnerer en Valgfri også. I sådanne tilfælde bruger kort() ville føre til en indlejret struktur, da kort() implementering foretager en ekstra indpakning internt.

Lad os se et andet eksempel for at få en bedre forståelse af denne situation:

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

Som vi kan se, ender vi med den indlejrede struktur Valgfri. Selvom det virker, er det ret besværligt at bruge og giver ikke nogen yderligere null-sikkerhed, så det er bedre at holde en flad struktur.

Det er præcis hvad flatMap () hjælper os med at gøre:

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

3. Kort og Flatmap i streams

Begge metoder fungerer ens for Valgfri.

Det kort() metode indpakker den underliggende sekvens i en Strøm eksempel, mens flatMap () metode gør det muligt at undgå indlejrede Strøm struktur.

I det følgende eksempel kort() producerer en Strøm bestående af resultaterne af anvendelsen af ​​programmet toUpperCase () metode til elementerne i input Strøm:

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

kort() fungerer ret godt i så simpelt tilfælde, men hvad hvis vi har noget mere komplekst som en liste over lister som input.

Lad os se, hvordan det fungerer:

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

Dette uddrag udskriver en liste med lister [[a], [b]].

Lad os nu bruge en flatMap ():

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

Resultatet af et sådant uddrag bliver fladt ud til [a, b].

Than flatMap () metode flader først input Strøm af Strømme til en Strøm af Strenge (for mere om udfladning, se artiklen). Derefter fungerer det på samme måde som kort() metode.

4. Konklusion

Java 8 giver os mulighed for at bruge kort() og flatMap () metoder, der oprindeligt blev brugt på funktionelle sprog.

Vi kan påberåbe dem Strømme og ekstraudstyr. Disse metoder hjælper os med at få kortlagte objekter ved at anvende den medfølgende kortlægningsfunktion.

Som altid kan du tjekke eksemplerne i denne artikel på GitHub.