Gyűjtemény szűrése Java-ban

1. Áttekintés

Ebben a rövid bemutatóban megnézzük a Java-gyűjtemények szűrésének különböző módjait - vagyis minden olyan elem megtalálása, amely megfelel egy bizonyos feltételnek.

Ez egy alapvető feladat, amely gyakorlatilag bármely Java alkalmazásban jelen van.

Ezért jelentős az e célra funkcionalitást biztosító könyvtárak száma.

Ebben az oktatóanyagban különösen a következőkre térünk ki:

  • Java 8 adatfolyamok ' szűrő() funkció
  • Java 9 szűrő gyűjtő
  • Ide vonatkozó Eclipse gyűjtemények API-k
  • Apache-ék CollectionUtils szűrő () módszer
  • Guava's Gyűjtemények2 szűrő () megközelítés

2. A folyamok használata

A Java 8 bevezetése óta a streamek kulcsszerepet kaptak a legtöbb esetben, amikor adatgyűjtést kell feldolgoznunk.

Következésképpen a legtöbb esetben ez az előnyben részesített megközelítés, mivel Java-ban épül fel, és nem igényel további függőségeket.

2.1. Gyűjtemény szűrése a következővel: Patakok

Az egyszerűség kedvéért, az összes példában célunk egy olyan módszer létrehozása, amely csak a páros számokat kapja le az a-ból Gyűjtemény nak,-nek Egész szám értékek.

Így kifejezhetjük azt a feltételt, amelyet az egyes elemek „érték% 2 == 0‘.

Minden esetben ezt a feltételt a-ként kell meghatároznunk Állítmány tárgy:

nyilvános gyűjtemény findEvenNumbers (Collection baseCollection) {Predicate streamsPredicate = item -> item% 2 == 0; return baseCollection.stream () .filter (streamsPredicate) .collect (Collectors.toList ()); }

Fontos megjegyezni minden könyvtár, amelyet ebben az oktatóanyagban elemezünk, megadja a sajátját Állítmány végrehajtás, de még mindig mindegyik funkcionális interfészként van definiálva, ami lehetővé teszi számunkra, hogy a Lambda függvényeket deklaráljuk.

Ebben az esetben egy előre definiáltat használtunk Gyűjtő a Java biztosítja, amely az elemeket felhalmozza a Lista, de felhasználhattunk volna másokat is, ahogyan ez az előző bejegyzésben is szerepel.

2.2. Szűrés a Java 9-es gyűjtemény csoportosítása után

A folyamok lehetővé teszik számunkra az elemek összesítését a gyűjtő által gyűjtő.

Mégis, ha úgy szűrünk, mint az utolsó részben, néhány elemet korai szakaszban eldobhatunk, még mielőtt ez a gyűjtő játékba lépne.

Emiatt, a szűrő A gyűjtőt a Java 9-gyel vezették be azzal a céllal, hogy az algyűjteményeket csoportosítás után feldolgozza.

Példánk alapján képzeljük el, hogy az egyes egész számjegyek száma alapján szeretnénk csoportosítani gyűjteményünket, mielőtt kiszűrnénk a páratlan számokat:

nyilvános Térkép findEvenNumbersAfterGrouping (Collection baseCollection) {getQuantityOfDigits függvény = item -> (int) Math.log10 (item) + 1; return baseCollection.stream () .collect (groupingBy (getQuantityOfDigits, szűrés (elem -> elem% 2 == 0, toList ()))); }

Röviden, ha ezt a gyűjtőt használjuk, akkor egy üres értékbejegyzéssel zárulhatunk, míg ha csoportosítás előtt szűrünk, a gyűjtő egyáltalán nem hoz létre ilyen bejegyzést.

Természetesen a követelmények alapján választanánk a megközelítést.

3. Használata Eclipse gyűjtemények

Célkitűzésünk megvalósításához felhasználhatunk néhány más, harmadik féltől származó könyvtárat is, akár azért, mert annak oka, hogy alkalmazásunk nem támogatja a Java 8-at, vagy azért, mert ki akarunk használni néhány olyan hatékony funkciót, amelyet nem a Java nyújt.

Ilyen a Eclipse gyűjtemények, egy könyvtár, amely igyekszik lépést tartani az új paradigmákkal, fejlődik és átfogja a legújabb Java kiadások által bevezetett változásokat.

Kezdhetjük az Eclipse Gyűjtemények Bevezető bejegyzésének áttekintésével, hogy szélesebb körű ismeretekkel rendelkezzünk a könyvtár által nyújtott funkcionalitásról.

3.1. Függőségek

Kezdjük azzal, hogy hozzáadjuk a következő függőséget a projektünkhöz pom.xml:

 org.eclipse.collections eclipse-gyűjtemények 9.2.0 

A napfogyatkozás-gyűjtemények tartalmazza az összes szükséges adatszerkezeti interfészt és magát az API-t.

3.2. Gyűjtemény szűrése a következővel: Eclipse gyűjtemények

Most használjuk az eclipse szűrési funkcióit az egyik adatstruktúráján, például annak MutableList:

nyilvános gyűjtemény findEvenNumbers (Collection baseCollection) {Predicate eclipsePredicate = item -> item% 2 == 0; Gyűjtemény filteredList = Lists.mutable .ofAll (baseCollection) .select (eclipsePredicate); return filteredList; }

Alternatívaként használhatnánk a Hajtogat’S válassza ()statikus módszer a filteredList tárgy:

Gyűjtemény filteredList = Iterate.select (baseCollection, eclipsePredicate);

4. Az Apache használata CollectionUtils

Kezdeni az Apache-szal CollectionUtils könyvtár, megnézhetjük ezt a rövid oktatóanyagot, ahol kitérünk a felhasználására.

Ebben az oktatóanyagban azonban erre összpontosítunk szűrő() végrehajtás.

4.1. Függőségek

Először a következő függőségekre lesz szükségünk pom.xml fájl:

 org.apache.commons commons-gyűjtemények4 4.2 

4.2. Gyűjtemény szűrése a következővel: CollectionUtils

Most már készen állunk a CollectonUtils„Módszerek:

nyilvános gyűjtemény findEvenNumbers (Collection baseCollection) {ApachePredicate = item -> item% 2 == 0; CollectionUtils.filter (baseCollection, apachePredicate); return baseCollection; }

Figyelembe kell vennünk, hogy ez a módszer módosítja a baseCollection minden olyan elem eltávolításával, amely nem felel meg a feltételnek.

Ez azt jelenti az alap Gyűjteménynek változtathatónak kell lennie, különben kivételt vet.

5. Guava használata Gyűjtemények2

A korábbiakhoz hasonlóan elolvashatjuk korábbi, a „Guava-i gyűjtemények szűrése és átalakítása” című bejegyzésünket, amely további információkat tartalmaz erről a témáról.

5.1. Függőségek

Kezdjük azzal, hogy hozzáadjuk ezt a függőséget pom.xml fájl:

 com.google.guava guava 25.1-jre 

5.2. Gyűjtemény szűrése a következővel: Gyűjtemények2

Mint láthatjuk, ez a megközelítés meglehetősen hasonló az utolsó szakaszban követetthez:

nyilvános gyűjtemény findEvenNumbers (Collection baseCollection) {Predikál guavaPredicate = item -> item% 2 == 0; return Collections2.filter (baseCollection, guavaPredicate); }

Ismét itt meghatározunk egy guavai specifikumot Állítmány tárgy.

Ebben az esetben Guava nem módosítja a baseCollection, újat generál, így beválthatatlanul használható gyűjteményt használhatunk.

6. Következtetés

Összefoglalva, azt láttuk, hogy a Java-ban a gyűjtemények szűrésének sokféle módja van.

Annak ellenére, hogy általában a streameket részesítik előnyben, jó ismerni és szem előtt tartani a más könyvtárak által kínált funkcionalitást.

Különösen, ha támogatnunk kell a régebbi Java verziókat. Ha azonban ez a helyzet, akkor szem előtt kell tartanunk az oktatóanyagban használt legfrissebb Java-szolgáltatásokat, például a lambdákat névtelen osztályokkal.

Szokás szerint a bemutatóban bemutatott összes példát megtalálhatjuk a Github repóban.