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.