Brojanje podudaranja na filtru streama

1. Pregled

U ovom uputstvu istražit ćemo upotrebu Stream.count () metoda. Posebno, vidjet ćemo kako možemo kombinirati računati() metoda s filtar() metoda za brojanje podudaranja a Predikatprijavili smo se.

2. Korištenje Stream.count ()

The računati() Sama metoda pruža malu, ali vrlo korisnu funkcionalnost. Također ga možemo izvrsno kombinirati s drugim alatima, na primjer s Stream.filter ().

Upotrijebimo isto Kupac razred koji smo definirali u našem tutorialu Stream.filter ():

kupac javne klase {naziv privatnog niza; privatne int točke; // Konstruktor i standardni getteri}

Uz to, kreiramo istu kolekciju kupaca:

Kupac john = novi kupac ("John P.", 15); Kupac sarah = novi kupac ("Sarah M.", 200); Kupac charles = novi kupac ("Charles B.", 150); Kupac mary = novi kupac ("Mary T.", 1); Popis kupaca = Arrays.asList (john, sarah, charles, mary);

Dalje ćemo se prijaviti Stream metode na popisu za filtriranje i određivanje koliko podudaranja dobivaju naši filtri.

2.1. Brojanje elemenata

Pogledajmo vrlo osnovnu uporabu računati():

dugo brojanje = kupci.stream (). count (); assertThat (count) .isEqualTo (4L);

Imajte na umu da računati() vraća a dugo vrijednost.

2.2. Koristeći računati() S filtar()

Primjer u prethodnom pododjeljku nije bio baš impresivan. Mogli smo doći do istog rezultata s List.size () metoda.

Stream.count () stvarno sja kad ga kombiniramo s drugim Stream metode - najčešće sa filtar():

long countBigCustomers = kupci .stream () .filter (c -> c.getPoints ()> 100) .count (); assertThat (countBigCustomers) .isEqualTo (2L);

U ovom smo primjeru primijenili filtar na popis kupaca, a također smo dobili i broj kupaca koji ispunjavaju uvjet. U ovom slučaju imamo dva kupca s više od 100 bodova.

Naravno, može se dogoditi i da se nijedan element ne podudara s našim filtrom:

dugo brojanje = kupci .stream () .filter (c -> c.getPoints ()> 500) .count (); assertThat (count) .isEqualTo (0L); 

2.3. Koristeći računati() S naprednim filtrima

U našem vodiču o filtar(), vidjeli smo neke naprednije slučajeve upotrebe metode. Naravno, još uvijek možemo računati rezultat takvih filtar() operacijama.

Zbirke možemo filtrirati s više kriterija:

dugo brojanje = kupci .stream () .filter (c -> c.getPoints ()> 10 && c.getName (). startWith ("Charles")) .count (); assertThat (count) .isEqualTo (1L);

Ovdje smo filtrirali i prebrojali broj kupaca čija imena počinju s "Charles" i koji imaju više od 10 bodova.

Također možemo izdvojiti kriterije u vlastitu metodu i koristiti referencu metode:

dugo brojanje = kupci .stream () .filter (kupac :: imaOverHundredPoints) .count (); assertThat (count) .isEqualTo (2L);

3. Zaključak

U ovom smo članku vidjeli nekoliko primjera kako koristiti računati() metoda u kombinaciji s filtar() metoda za obradu tokova. Za daljnje slučajeve upotrebe računati(), provjerite druge metode koje vraćaju a Stream, poput onih prikazanih u našem vodiču o spajanju streamova s concat ().

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