Kako filtrirati zbirku na Javi

1. Pregled

U ovom kratkom vodiču, pregledat ćemo različite načine filtriranja zbirke na Javi - odnosno pronalaženje svih predmeta koji ispunjavaju određeni uvjet.

Ovo je temeljni zadatak koji je prisutan u praktički bilo kojoj Java aplikaciji.

Iz tog je razloga značajan broj knjižnica koje pružaju funkcionalnost u tu svrhu.

U ovom uputstvu posebno ćemo obuhvatiti:

  • Java 8 strujanja ' filtar() funkcija
  • Java 9 filtriranje kolektor
  • Relevantno Zbirke Eclipse Apis
  • Apacheov Filter CollectionUtils () metoda
  • Guava Filter Collections2 () pristup

2. Korištenje streamova

Otkako je predstavljena Java 8, Streamovi su stekli ključnu ulogu u većini slučajeva kada moramo obraditi zbirku podataka.

Slijedom toga, ovo je preferirani pristup u većini slučajeva jer je izgrađen u Javi i ne zahtijeva dodatne ovisnosti.

2.1. Filtriranje zbirke pomoću Potoci

Zbog jednostavnosti, u svim primjerima naš će cilj biti stvoriti metodu koja dohvaća samo parne brojeve iz a Kolekcija od Cijeli broj vrijednosti.

Dakle, možemo izraziti uvjet koji ćemo koristiti za procjenu svake stavke kao "vrijednost% 2 == 0‘.

U svim ćemo slučajevima ovo stanje morati definirati kao a Predikat objekt:

javna Zbirka findEvenNumbers (zbirka baseCollection) {Predikati streamsPredicate = item -> item% 2 == 0; vratiti baseCollection.stream () .filter (streamsPredicate) .collect (Collectors.toList ()); }

Važno je to napomenuti svaka knjižnica koju analiziramo u ovom vodiču pruža svoju Predikat provedba, ali to je svejedno, sva su definirana kao funkcionalna sučelja, što nam omogućava da koristimo Lambda funkcije za njihovo deklariranje.

U ovom smo slučaju koristili unaprijed definiranu Kolektor pruža Java koja akumulira elemente u Popis, ali mogli smo koristiti i druge, kao što je objašnjeno u ovom prethodnom postu.

2.2. Filtriranje nakon grupiranja zbirke u Javi 9

Potoci nam omogućuju agregiranje stavki pomoću grupiranjeKad sakupljača.

Ipak, ako filtriramo kao u prošlom odjeljku, neki bi se elementi mogli odbaciti u ranoj fazi, prije nego što ovaj kolektor uđe u igru.

Zbog ovog razloga, the filtriranje collector predstavljen je s Javom 9, s ciljem obrade podzbirki nakon što su grupirane.

Slijedimo naš primjer, zamislimo da svoju zbirku želimo grupirati na temelju broja znamenki koje ima svaki cijeli broj, prije nego što filtriramo neparne brojeve:

javna Karta findEvenNumbersAfterGrouping (Collection baseCollection) {Funkcija getQuantityOfDigits = item -> (int) Math.log10 (item) + 1; vratiti baseCollection.stream () .collect (groupingBy (getQuantityOfDigits, filtriranje (stavka -> stavka% 2 == 0, toList ()))); }

Ukratko, ako koristimo ovaj sakupljač, mogli bismo završiti s praznim unosom vrijednosti, dok ako filtriramo prije grupiranja, sakupljač uopće ne bi stvorio takav unos.

Naravno, odabrali bismo pristup na temelju naših zahtjeva.

3. Korištenje Zbirke Eclipse

Također možemo koristiti neke druge biblioteke trećih strana da bismo postigli svoj cilj, bilo ako je to zbog toga što naša aplikacija ne podržava Java 8 ili zato što želimo iskoristiti neke moćne funkcije koje Java ne pruža.

Takav je slučaj Zbirke Eclipse, knjižnica koja nastoji pratiti nove paradigme, razvijajući se i prihvaćajući promjene uvedene u svim najnovijim izdanjima Java.

Možemo započeti istraživanjem uvodnog posta o zbirkama Eclipse kako bismo imali šire znanje o funkcionalnostima koje pruža ova knjižnica.

3.1. Ovisnosti

Počnimo dodavanjem sljedeće ovisnosti našem projektu pom.xml:

 org.eclipse.collections eclipse-collection 9.2.0 

The pomrčine-kolekcije uključuje sva potrebna sučelja strukture podataka i sam API.

3.2. Filtriranje zbirke pomoću Zbirke Eclipse

Upotrijebimo sada funkciju filtriranja eclipsea na jednoj od njegovih podataka, poput njegove Promjenjiva lista:

javna kolekcija findEvenNumbers (zbirka baseCollection) {Predikat eclipsePredicate = item -> item% 2 == 0; Zbirka filteredList = Lists.mutable .ofAll (baseCollection) .select (eclipsePredicate); povratak filteredList; }

Kao alternativu mogli smo koristiti Ponavljati‘S Odaberi()statička metoda za definiranje filteredList objekt:

Zbirka filteredList = Iterate.select (baseCollection, eclipsePredicate);

4. Korištenje Apacheova CollectionUtils

Za početak s Apacheovim CollectionUtils knjižnicu, možemo pogledati ovaj kratki vodič gdje smo pokrili njegove upotrebe.

Međutim, u ovom uputstvu usredotočit ćemo se na njegov filtar() provedba.

4.1. Ovisnosti

Prvo, trebat će nam sljedeće ovisnosti u našem pom.xml datoteka:

 org.apache.commons commons-collection4 4.2 

4.2. Filtriranje zbirke pomoću CollectionUtils

Sada smo spremni za upotrebu CollectonUtils'Metode:

javna kolekcija findEvenNumbers (zbirka baseCollection) {Predikat apachePredicate = item -> item% 2 == 0; CollectionUtils.filter (baseCollection, apachePredicate); return baseCollection; }

Moramo uzeti u obzir da ova metoda modificira baseCollection uklanjanjem svake stavke koja ne odgovara stanju.

Ovo znači to osnovna zbirka mora biti promjenjiva, u suprotnom će se pojaviti iznimka.

5. Korištenje Guave Zbirke2

Kao i prije, za daljnje informacije o ovoj temi možemo pročitati naš prethodni post "Filtriranje i pretvaranje zbirki u Guavi".

5.1. Ovisnosti

Počnimo s dodavanjem ove ovisnosti u naš pom.xml datoteka:

 com.google.guava guava 25,1-jre 

5.2. Filtriranje zbirke pomoću Zbirke2

Kao što vidimo, ovaj je pristup prilično sličan onome u zadnjem odjeljku:

javna zbirka findEvenNumbers (zbirka baseCollection) {Predikat guavaPredicate = item -> item% 2 == 0; vratiti Collections2.filter (baseCollection, guavaPredicate); }

Opet, ovdje definiramo specifičnost Guave Predikat objekt.

U ovom slučaju, Guava ne mijenja baseCollection, generira novu, tako da možemo koristiti nepromjenjivu kolekciju kao ulaz.

6. Zaključak

Ukratko, vidjeli smo da na Javi postoji mnogo različitih načina filtriranja zbirki.

Iako su streamovi obično preferirani pristup, dobro je znati i imati na umu funkcionalnost koju nude druge knjižnice.

Pogotovo ako trebamo podržati starije Java verzije. Međutim, ako je to slučaj, moramo imati na umu nedavne Java značajke koje se koriste u cijelom vodiču, poput lambda, treba zamijeniti anonimnim klasama.

Kao i obično, sve primjere prikazane u ovom vodiču možemo pronaći u našem Github repo-u.