Zbrajanje brojeva s Java Streamsom

1. Uvod

U ovom brzom vodiču pokazat ćemo razne načine izračunavanje zbroja cijelih brojeva,koristeći Stream API.

Radi jednostavnosti u našim ćemo primjerima koristiti cijele brojeve. Međutim, iste metode možemo primijeniti i na žudnje i parove.

2. Korištenje Stream.reduce ()

Stream.reduce () je terminalna operacija kojavrši redukciju na elementima struje.

Primjenjuje binarni operator (akumulator) na svaki element u toku, gdje je prvi operand povratna vrijednost prethodne aplikacije, a drugi trenutni element toka.

U prvoj metodi korištenja smanjiti() metoda, funkcija akumulatora je lambda izraz koji dodaje dva Cijeli broj vrijednosti i vraća an Cijeli broj vrijednost:

Popis cijelih brojeva = Arrays.asList (1, 2, 3, 4, 5); Cijeli zbroj = cijeli brojevi.stream () .reduce (0, (a, b) -> a + b);

Na isti način, možemo koristiti već postojeća Java metoda:

Popis cijelih brojeva = Arrays.asList (1, 2, 3, 4, 5); Integer sum = integers.stream () .reduce (0, Integer :: sum);

Ili možemo definirati i koristiti našu prilagođenu metodu:

javna klasa ArithmeticUtils {public static int add (int a, int b) {return a + b; }} 

Tada ovu funkciju možemo proslijediti kao parametar datoteci smanjiti() metoda:

Popis cijelih brojeva = Arrays.asList (1, 2, 3, 4, 5); Cijeli zbroj = cijeli brojevi.stream () .reduce (0, ArithmeticUtils :: add); 

3. Korištenje Stream.collect ()

Druga metoda za izračunavanje zbroja popisa cijelih brojeva je pomoću prikupiti() rad terminala:

Popis cijelih brojeva = Arrays.asList (1, 2, 3, 4, 5); Integer sum = integers.stream () .collect (Collectors.summingInt (Integer :: intValue));

Slično tome, Kolekcionari razred pruža summingLong () i summingDouble () metode za izračunavanje zbroja duljina, odnosno dvostrukih.

4. Korištenje IntStream.sum ()

Stream API pruža nam mapToInt () srednja operacija, koja pretvara naš tok u IntStream objekt.

Ova metoda uzima parametar za mapiranje koji koristi za pretvorbu, a zatim možemo nazvati iznos() metoda za izračunavanje zbroja elemenata toka.

Pogledajmo kratki primjer kako ga možemo koristiti:

Popis cijelih brojeva = Arrays.asList (1, 2, 3, 4, 5); Integer zbroj = integers.stream () .mapToInt (Integer :: intValue) .sum ();

Na isti način možemo koristiti i mapToLong () i mapToDouble () metode za izračunavanje zbrojeva duljina, odnosno dvostrukih.

5. Korištenje Struja # zbroj s Karta

Za izračun zbroja vrijednosti a Karta strukturu podataka, prvo stvaramo a tok iz vrijednosti od toga Karta, tada primjenjujemo jednu od metoda koje smo prethodno koristili.

Na primjer, pomoću IntStream.sum ():

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

6. Korištenje Struja # zbroj s Predmetima

Zamislimo da imamo popis objekata i koje želimo izračunati zbroj svih vrijednosti datog polja ovih predmeta.

Na primjer:

predmet javne klase {private int id; privatna cijela cijena; javna stavka (int id, cijela cijena) {this.id = id; this.price = cijena; } // Standardni getteri i postavljači} 

Dalje, zamislimo da želimo izračunati ukupnu cijenu svih stavki na sljedećem popisu:

Stavka item1 = nova stavka (1, 10); Stavka item2 = nova stavka (2, 15); Stavka item3 = nova stavka (3, 25); Stavka item4 = nova stavka (4, 40); Stavke na listi = Arrays.asList (item1, item2, item3, item4);

U ovom slučaju, da bismo izračunali zbroj pomoću metoda prikazanih u prethodnim primjerima, moramo nazvati karta() metoda pretvoriti naš tok u tok cijelih brojeva.

Kao rezultat, možemo koristiti Stream.reduce (), Stream.collect () i IntStream.sum () za izračun zbroja:

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

7. Korištenje Struja # zbroj s Niz

Pretpostavimo da imamo a Niz objekt koji sadrži neke cijele brojeve.

Da bismo izračunali zbroj tih cijelih brojeva, prije svega, trebamo pretvoriti to Niz u an Polje, onda trebamo za filtriranje necjelobrojnih elemenata, i konačno, pretvoriti preostale elemente tog niza u brojeve.

Pogledajmo sve ove korake na djelu:

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

8. Zaključak

U ovom smo tutorijalu vidjeli nekoliko metoda kako izračunati zbroj popisa cijelih brojeva pomoću Stream API-ja. Također, koristili smo ove metode za izračun zbroja vrijednosti datog polja popisa objekata, zbroja vrijednosti karte, kao i brojeva unutar zadanog Niz objekt.

Kao i uvijek, cjeloviti kôd dostupan je na GitHub-u.