Summing Numbers med Java Streams

1. Introduktion

I denne hurtige vejledning viser vi forskellige måder at beregning af summen af ​​heltal,ved hjælp af Stream API.

Af hensyn til enkelheden bruger vi heltal i vores eksempler. Vi kan dog også anvende de samme metoder til længsler og fordoblinger.

2. Brug Stream.reduce ()

Stream.reduce () er en terminaloperation, derudfører en reduktion af elementerne i strømmen.

Det anvender en binær operator (akkumulator) til hvert element i strømmen, hvor den første operand er returværdien af ​​den forrige applikation, og den anden er det aktuelle streamelement.

I den første metode til brug af reducere() metode er akkumulatorfunktionen et lambda-udtryk, der tilføjer to Heltal værdier og returnerer en Heltal værdi:

Liste heltal = Arrays.asList (1, 2, 3, 4, 5); Heltalsum = heltal.stream () .reducer (0, (a, b) -> a + b);

På samme måde kan vi bruge en allerede eksisterende Java-metode:

Liste heltal = Arrays.asList (1, 2, 3, 4, 5); Heltalsum = heltal.stream () .reduktion (0, Heltals :: sum);

Eller vi kan definere og bruge vores brugerdefinerede metode:

offentlig klasse ArithmeticUtils {public static int add (int a, int b) {return a + b; }} 

Derefter kan vi videregive denne funktion som en parameter til reducere() metode:

Liste heltal = Arrays.asList (1, 2, 3, 4, 5); Heltalsum = heltal.stream () .reduce (0, ArithmeticUtils :: add); 

3. Brug Stream.collect ()

Den anden metode til beregning af summen af ​​en liste over heltal er ved hjælp af indsamle() terminal drift:

Liste heltal = Arrays.asList (1, 2, 3, 4, 5); Heltalsum = heltal.stream () .collect (Collectors.summingInt (Heltal :: intValue));

Tilsvarende er Samlere klasse giver summingLong () og summingDouble () metoder til beregning af summen af ​​henholdsvis længde og fordobling.

4. Brug IntStream.sum ()

Stream API giver os mapToInt () mellemdrift, som konverterer vores stream til en IntStream objekt.

Denne metode tager en kortlægger som en parameter, som den bruger til at udføre konverteringen, så kan vi kalde den sum() metode til at beregne summen af ​​strømens elementer.

Lad os se et hurtigt eksempel på, hvordan vi kan bruge det:

Liste heltal = Arrays.asList (1, 2, 3, 4, 5); Heltalsum = heltal.stream () .mapToInt (Heltal :: intValue) .sum ();

På samme måde kan vi bruge mapToLong () og mapToDouble () metoder til beregning af summen af ​​henholdsvis længde og fordobling.

5. Brug Stream # sum med Kort

At beregne værdien af ​​a Kort datastruktur, først opretter vi en streame fra værdierne af det Kort, så anvender vi en af ​​de metoder, vi tidligere har brugt.

For eksempel ved hjælp af IntStream.sum ():

Heltalsum = map.values ​​() .stream () .mapToInt (Integer :: valueOf) .sum ();

6. Brug Stream # sum med objekter

Lad os forestille os, at vi har en liste over objekter, og som vi vil beregne summen af ​​alle værdierne i et givet felt af disse objekter.

For eksempel:

public class Item {private int id; privat helpris; public Item (int id, Integer price) {this.id = id; denne pris = pris; } // Standard getters og setters} 

Lad os forestille os, at vi vil beregne den samlede pris for alle varer på følgende liste:

Varepost1 = ny vare (1, 10); Varepost2 = ny vare (2, 15); Varepost3 = ny vare (3, 25); Item item4 = new Item (4, 40); Listeelementer = Arrays.asList (item1, item2, item3, item4);

I dette tilfælde skal vi kalde summen for at beregne summen ved hjælp af metoderne vist i tidligere eksempler kort() metode at konvertere vores strøm til en strøm af heltal.

Som et resultat kan vi bruge Stream.reduce (), Stream.collect () og IntStream.sum () at beregne summen:

Heltalsum = items.stream () .map (x -> x.getPrice ()) .reduce (0, ArithmeticUtils :: add); 
Heltalsum = items.stream () .map (x -> x.getPrice ()) .reduce (0, Integer :: sum);
Heltalsum = items.stream () .map (item -> item.getPrice ()) .reduce (0, (a, b) -> a + b);
Heltalsum = items.stream () .map (x -> x.getPrice ()) .collect (Collectors.summingInt (Heltal :: intValue));
items.stream () .mapToInt (x -> x.getPrice ()) .sum ();

7. Brug Stream # sum med Snor

Lad os antage, at vi har en Snor objekt, der indeholder nogle heltal.

For først at beregne summen af ​​disse heltal har vi brug for at konvertere det Snor ind i en Array, så har vi brug for det for at filtrere elementerne, der ikke er helt, ud, og endelig, konvertere de resterende elementer af denne matrix i tal.

Lad os se alle disse trin i aktion:

Strengstreng = "Vare1 10 Vare2 25 Vare3 30 Vare4 45"; Heltalsum = Arrays.stream (string.split ("")). Filter ((s) -> s.matches ("\ d +")) .mapToInt (Integer :: valueOf) .sum ();

8. Konklusion

I denne vejledning så vi flere metoder til, hvordan man beregner summen af ​​en liste over heltal ved hjælp af Stream API. Vi brugte også disse metoder til at beregne summen af ​​værdierne i et givet felt i en liste over objekter, summen af ​​værdierne på et kort samt tallene inden for en given Snor objekt.

Som altid er den komplette kode tilgængelig på GitHub.