Ako filtrovať zbierku v Jave

1. Prehľad

V tomto krátkom návode pozrieme sa na rôzne spôsoby filtrovania zbierky v Jave - to znamená nájdenie všetkých predmetov, ktoré spĺňajú určitú podmienku.

Toto je zásadná úloha, ktorá je prítomná prakticky v každej aplikácii Java.

Z tohto dôvodu je počet knižníc, ktoré poskytujú funkcie na tento účel, značný.

V tomto výučbe sa budeme zaoberať najmä:

  • Streamovanie Java 8 filter () funkcie
  • Java 9 filtrovanie zberateľ
  • Relevantné Zbierky zatmenia API
  • Apache Filter CollectionUtils () metóda
  • Guava Filter Collections2 () prístup

2. Používanie streamov

Od zavedenia Java 8 získali prúdy kľúčovú rolu vo väčšine prípadov, keď musíme spracovať zbierku údajov.

Toto je vo väčšine prípadov preferovaný prístup, pretože je zabudovaný v Jave a nevyžaduje žiadne ďalšie závislosti.

2.1. Filtrovanie zbierky pomocou Prúdy

Kvôli jednoduchosti vo všetkých príkladoch bude naším cieľom vytvorenie metódy, ktorá získa iba párne čísla z a Zbierka z Celé číslo hodnoty.

Môžeme teda vyjadriť podmienku, ktorú použijeme na vyhodnotenie každej položky ako „hodnota% 2 == 0‘.

Vo všetkých prípadoch budeme musieť túto podmienku definovať ako a Predikát objekt:

verejná zbierka findEvenNumbers (zbierka baseCollection) {predikát streamsPredicate = položka -> položka% 2 == 0; návrat baseCollection.stream () .filter (streamsPredicate) .collect (Collectors.toList ()); }

Je dôležité si to uvedomiť každá knižnica, ktorú analyzujeme v tomto tutoriále, poskytuje vlastnú Predikát implementácia, ale stále sú všetky definované ako funkčné rozhrania, čo nám umožňuje používať ich funkcie Lambda na ich deklarovanie.

V tomto prípade sme použili preddefinované Zberateľ poskytované programom Java, ktorý zhromažďuje prvky do a Zoznam, ale mohli sme použiť aj iné, o ktorých sa hovorí v tomto predchádzajúcom príspevku.

2.2. Filtrovanie po zoskupení kolekcie v prostredí Java 9

Streamy nám umožňujú agregovať položky pomocou zoskupenieBy zberateľ.

Ak však filtrujeme tak, ako sme to robili v poslednej časti, niektoré prvky by sa mohli vyhodiť v ranom štádiu, skôr ako tento kolektor vstúpi do hry.

Pre tento dôvod, the filtrovanie Collector bol predstavený v prostredí Java 9 s cieľom spracovania podkolekcií po ich zoskupení.

Po našom príklade si predstavíme, že chceme našu zbierku zoskupiť podľa počtu číslic, ktoré má každé celé číslo, a potom odfiltrujeme nepárne čísla:

verejná mapa findEvenNumbersAfterGrouping (Collection baseCollection) {Funkcia getQuantityOfDigits = item -> (int) Math.log10 (item) + 1; návrat baseCollection.stream () .collect (groupingBy (getQuantityOfDigits, filtrovanie (item -> item% 2 == 0, toList ()))); }

Stručne povedané, ak použijeme tento kolektor, mohli by sme skončiť s prázdnym záznamom hodnoty, zatiaľ čo ak filtrujeme pred zoskupením, kolektor by taký záznam vôbec nevytvoril.

Prístup by sme si samozrejme vybrali na základe našich požiadaviek.

3. Používanie Zbierky zatmenia

Na splnenie nášho cieľa môžeme tiež použiť niektoré ďalšie knižnice tretích strán, či už z dôvodu, že naša aplikácia nepodporuje Java 8, alebo preto, že chceme využiť niektoré výkonné funkcie, ktoré Java neposkytuje.

To je prípad Zbierky zatmenia, knižnica, ktorá sa snaží držať krok s novými paradigmami, vyvíjať a prijímať zmeny zavedené vo všetkých najnovších vydaniach Java.

Môžeme začať preskúmaním nášho Úvodného príspevku zbierok Eclipse, aby sme mali širšie znalosti o funkciách poskytovaných touto knižnicou.

3.1. Závislosti

Začnime pridaním nasledujúcej závislosti do nášho projektu pom.xml:

 org.eclipse.collections kolekcie zatmenia 9.2.0 

The zbierky zatmenia obsahuje všetky potrebné rozhrania dátovej štruktúry a samotné API.

3.2. Filtrovanie zbierky pomocou Zbierky zatmenia

Poďme teraz použiť funkciu filtrovania zatmenia na jednej z jej dátových štruktúr, napríklad na jej MutableList:

verejná zbierka findEvenNumbers (zbierka baseCollection) {predikát eclipsePredicate = položka -> položka% 2 == 0; Zbierka filtrovanýList = Zoznamy.mutovateľné .ofAll (baseCollection) .select (eclipsePredicate); návrat filtrovaný zoznam; }

Ako alternatívu sme mohli použiť Iterovať‘S vyberte ()statická metóda na definovanie filtrovaný zoznam objekt:

Zbierka filtrovanýList = Iterate.select (baseCollection, eclipsePredicate);

4. Používanie Apache CollectionUtils

Ak chcete začať s Apache CollectionUtils knižnici, môžeme si pozrieť tento krátky tutoriál, kde sme sa venovali jeho použitiu.

V tomto tutoriále sa však zameriame na jeho filter () implementácia.

4.1. Závislosti

Najprv budeme potrebovať nasledujúce závislosti v našom pom.xml spis:

 org.apache.commons commons-collections4 4.2 

4.2. Filtrovanie zbierky pomocou CollectionUtils

Teraz sme pripravení použiť CollectonUtils„Metódy:

verejná zbierka findEvenNumbers (zbierka baseCollection) {Predicate apachePredicate = položka -> položka% 2 == 0; CollectionUtils.filter (baseCollection, apachePredicate); návrat baseCollection; }

Musíme vziať do úvahy, že táto metóda upravuje baseCollection odstránením každej položky, ktorá nezodpovedá podmienke.

To znamená, že základná kolekcia musí byť premenlivá, inak spôsobí výnimku.

5. Používanie Guava Zbierky2

Rovnako ako predtým si môžeme prečítať náš predchádzajúci príspevok „Filtrovanie a transformácia zbierok na Guave“, kde nájdete ďalšie informácie o tejto téme.

5.1. Závislosti

Začnime pridaním tejto závislosti do našej pom.xml spis:

 com.google.guava guava 25,1-jre 

5.2. Filtrovanie zbierky pomocou Zbierky2

Ako vidíme, tento prístup je dosť podobný prístupu použitému v poslednej časti:

verejná zbierka findEvenNumbers (zbierka baseCollection) {predikát guavaPredicate = položka -> položka% 2 == 0; návrat Collections2.filter (baseCollection, guavaPredicate); }

Opäť tu definujeme špecifický Guava Predikát objekt.

V takom prípade Guava nezmení baseCollection, generuje nový, takže ako vstup môžeme použiť nemennú kolekciu.

6. Záver

V súhrne sme videli, že v Jave existuje veľa rôznych spôsobov filtrovania zbierok.

Aj keď sú prúdy zvyčajne preferovaným prístupom, je dobré poznať a pamätať na funkčnosť, ktorú ponúkajú iné knižnice.

Najmä ak potrebujeme podporiť staršie verzie Java. Ak je to však tak, musíme mať na pamäti nedávne funkcie Java používané v tomto výučbe, napríklad lambdas, by mali byť nahradené anonymnými triedami.

Ako obvykle, všetky príklady zobrazené v tomto tutoriále nájdeme v našom repozitári Github.


$config[zx-auto] not found$config[zx-overlay] not found