Primitieve typestreams in Java 8

1. Inleiding

De Stream API was een van de belangrijkste functies die in Java 8 zijn toegevoegd.

In het kort stelt de API ons in staat om verzamelingen en andere reeksen elementen - gemakkelijker en efficiënter - te verwerken door middel van een declaratieve API.

2. Primitieve stromen

Streams werken voornamelijk met verzamelingen objecten en niet met primitieve typen.

Gelukkig, om een ​​manier te bieden om met de drie meest gebruikte primitieve typen te werken: int, lang en dubbele - de standaardbibliotheek bevat drie primitief-gespecialiseerde implementaties: IntStream, LongStream, en DoubleStream.

Primitieve streams zijn beperkt, voornamelijk vanwege boxing overhead en omdat het creëren van gespecialiseerde streams voor andere primitieven in veel gevallen niet zo nuttig is.

3. Rekenkundige bewerkingen

Laten we beginnen met een paar interessante methoden voor veelgebruikte rekenkundige bewerkingen, zoals min, max. hoogte, som, en gemiddelde:

int [] gehele getallen = nieuwe int [] {20, 98, 12, 7, 35}; int min = Arrays.stream (gehele getallen) .min () .getAsInt (); // retourneert 7

Laten we nu het bovenstaande codefragment doorlopen om te begrijpen wat er aan de hand is.

We hebben onze IntStream door het gebruiken van java.util.Arrays.stream (int []) en gebruikte vervolgens de min () methode om het laagste gehele getal te krijgen als java.util.OptionalInt en uiteindelijk gebeld getAsInt () om het int waarde.

Een andere manier om een IntStream gebruikt IntStream.of (int ...). De max () methode retourneert het grootste gehele getal:

int max = IntStream.of (20, 98, 12, 7, 35) .max () .getAsInt (); // retourneert 98

Vervolgens - om de som van gehele getallen te krijgen, noemen we gewoon de som() methode en we hoeven niet te gebruiken getAsInt () omdat het het resultaat al retourneert als een int waarde:

int sum = IntStream.of (20, 98, 12, 7, 35) .sum (); // retourneert 172

We roepen de gemiddelde() methode om het gemiddelde van gehele getallen te krijgen en zoals we kunnen zien, zouden we moeten gebruiken getAsDouble () aangezien het een waarde van type retourneert dubbele.

dubbele gemiddelde = IntStream.of (20, 98, 12, 7, 35) .average () .getAsDouble (); // retourneert 34,4

4. Bereik

We kunnen ook een IntStream gebaseerd op een bereik:

int sum = IntStream.range (1, 10) .sum (); // retourneert 45 int sum = IntStream.rangeClosed (1, 10) .sum (); // retourneert 55

Zoals het bovenstaande codefragment laat zien, zijn er twee manieren om een ​​reeks gehele getallen te maken bereik () en rangeClosed ().

Het verschil is dat het einde van bereik () is exclusief terwijl het inclusief is in rangeClosed ().

Bereikmethoden zijn alleen beschikbaar voor IntStream en LongStream.

We kunnen bereik gebruiken als een mooie vorm van een for-each-lus:

IntStream.rangeClosed (1, 5) .forEach (System.out :: println);

Wat goed is om ze te gebruiken als vervanging voor elke lus, is dat we ook kunnen profiteren van de parallelle uitvoering:

IntStream.rangeClosed (1, 5) .parallel () .forEach (System.out :: println);

Hoe nuttig deze mooie loops ook zijn, het is nog steeds beter om de traditionele for-loops te gebruiken in plaats van de functionele voor eenvoudige iteraties vanwege de eenvoud, leesbaarheid en prestaties in sommige gevallen.

5. Boksen en uitpakken

Er zijn momenten waarop we primitieve waarden moeten converteren naar hun wrapper-equivalenten.

In die gevallen kunnen we de Verpakt() methode:

Lijst evenInts = IntStream.rangeClosed (1, 10) .filter (i -> i% 2 == 0) .boxed () .collect (Collectors.toList ());

We kunnen ook converteren van de stream van de wrapper-klasse naar de primitieve stream:

// retourneert 78 int sum = Arrays.asList (33,45) .stream () .mapToInt (i -> i) .sum ();

We kunnen altijd gebruik maken van mapToXxx en flatMapToXxx methoden om primitieve stromen te creëren.

6. Conclusie

Java Streams is een zeer krachtige toevoeging aan de taal. We hebben hier nauwelijks het oppervlak van primitieve stromen bekrast, maar zoals je ze al kunt gebruiken om productief te zijn.

En, zoals altijd, zijn codevoorbeelden te vinden op GitHub.