Getallen optellen met Java-streams

1. Inleiding

In deze korte tutorial laten we verschillende manieren zien om het berekenen van de som van gehele getallen,met behulp van de Stream API.

Eenvoudigheidshalve gebruiken we gehele getallen in onze voorbeelden. We kunnen dezelfde methoden echter ook toepassen op longs en doubles.

2. Met behulp van Stream.reduce ()

Stream.reduce () is een terminaloperatie dievoert een reductie uit op de elementen van de stroom.

Het past een binaire operator (accumulator) toe op elk element in de stream, waarbij de eerste operand de retourwaarde van de vorige applicatie is en de tweede het huidige streamelement.

Bij de eerste methode om de verminderen() methode, is de accumulatorfunctie een lambda-uitdrukking die twee optelt Geheel getal waarden en retourneert een Geheel getal waarde:

Lijst gehele getallen = Arrays.asList (1, 2, 3, 4, 5); Geheel getal som = gehele getallen. Stroom (). Verminderen (0, (a, b) -> a + b);

Op dezelfde manier kunnen we een reeds gebruiken bestaande Java-methode:

Lijst gehele getallen = Arrays.asList (1, 2, 3, 4, 5); Geheel getal som = gehele getallen. Stroom (). Verminderen (0, Geheel getal :: som);

Of we kunnen onze aangepaste methode definiëren en gebruiken:

openbare klasse ArithmeticUtils {openbare statische int add (int a, int b) {return a + b; }} 

Vervolgens kunnen we deze functie als parameter doorgeven aan de verminderen() methode:

Lijst gehele getallen = Arrays.asList (1, 2, 3, 4, 5); Geheel getal som = gehele getallen.stream () .reduce (0, ArithmeticUtils :: add); 

3. Met behulp van Stream.collect ()

De tweede methode om de som van een lijst met gehele getallen te berekenen, is door de verzamelen() terminal operatie:

Lijst gehele getallen = Arrays.asList (1, 2, 3, 4, 5); Geheel getal som = gehele getallen.stream () .collect (Collectors.summingInt (Geheel getal :: intValue));

Evenzo is het Verzamelaars klasse biedt summingLong () en summingDouble () methoden om de som van respectievelijk longs en doubles te berekenen.

4. Met behulp van IntStream.sum ()

De Stream API biedt ons de mapToInt () tussenliggende bewerking, die onze stream omzet in een IntStream voorwerp.

Deze methode neemt een mapper als parameter, die het gebruikt om de conversie uit te voeren, dan kunnen we de som() methode om de som van de elementen van de stream te berekenen.

Laten we een snel voorbeeld bekijken van hoe we het kunnen gebruiken:

Lijst gehele getallen = Arrays.asList (1, 2, 3, 4, 5); Geheel getal som = gehele getallen.stream () .mapToInt (Geheel getal :: intValue) .sum ();

Op dezelfde manier kunnen we de mapToLong () en mapToDouble () methoden om de som van respectievelijk longs en doubles te berekenen.

5. Met behulp van Stroom # som met Kaart

Om de som van waarden van a te berekenen Kaart datastructuur maken we eerst een stream van de waarden van dat Kaart, dan passen we een van de methoden toe die we eerder hebben gebruikt.

Bijvoorbeeld door IntStream.sum ():

Geheel getal som = map.values ​​() .stream () .mapToInt (Geheel getal :: valueOf) .sum ();

6. Met behulp van Stroom # som met objecten

Laten we ons voorstellen dat we een lijst met objecten hebben en die we willen berekenen de som van alle waarden van een bepaald veld van deze objecten.

Bijvoorbeeld:

openbare klasse Item {privé int id; private Integer prijs; openbaar item (int id, prijs geheel getal) {this.id = id; this.price = prijs; } // Standaard getters en setters} 

Laten we ons vervolgens voorstellen dat we de totale prijs van alle items van de volgende lijst willen berekenen:

Item item1 = nieuw item (1, 10); Item item2 = nieuw item (2, 15); Item item3 = nieuw item (3, 25); Item item4 = nieuw item (4, 40); Lijstitems = Arrays.asList (item1, item2, item3, item4);

In dit geval moeten we, om de som te berekenen met behulp van de methoden die in eerdere voorbeelden zijn getoond, de kaart() methode om onze stroom om te zetten in een stroom van gehele getallen.

Als resultaat kunnen we gebruiken Stream.reduce (), Stream.collect () en IntStream.sum () om de som te berekenen:

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

7. Met behulp van Stroom # som met Draad

Laten we aannemen dat we een Draad object dat enkele gehele getallen bevat.

Om de som van deze gehele getallen te berekenen, hebben we allereerst nodig om dat om te zetten Draad in een Array, dan hebben we nodig om de niet-gehele elementen eruit te filteren, en tenslotte, zet de overige elementen om van die array in getallen.

Laten we al deze stappen in actie zien:

String string = "Item1 10 Item2 25 Item3 30 Item4 45"; Geheel getal som = Arrays.stream (string.split ("")) .filter ((s) -> s.matches ("\ d +")) .mapToInt (Geheel getal :: valueOf) .sum ();

8. Conclusie

In deze zelfstudie hebben we verschillende methoden gezien om de som van een lijst met gehele getallen te berekenen met behulp van de Stream API. We hebben deze methoden ook gebruikt om de som van de waarden van een bepaald veld van een lijst met objecten, de som van de waarden van een kaart en de getallen binnen een bepaald veld te berekenen. Draad voorwerp.

Zoals altijd is de volledige code beschikbaar op GitHub.