Gyűjtemények szűrése és átalakítása Guavában

1. Áttekintés

Ebben az oktatóanyagban bemutatjuk, hogyan kell szűrje és alakítsa át a gyűjteményeket Guava-val.

Szűrni fogunk a Predikátumok segítségével, transzformálunk a könyvtár által biztosított funkciók segítségével, végül meglátjuk, hogyan lehet kombinálni a szűrést és az átalakítást.

2. Szűrjön egy gyűjteményt

Kezdjük egy egyszerű példával gyűjtemény szűrése. A dobozon kívüli Predikátumot fogjuk használni, amelyet a könyvtár biztosít és a Jóslatok használati osztály:

@Test public void whenFilterWithIterables_thenFiltered () {List list = Lists.newArrayList ("John", "Jane", "Adam", "Tom"); Iterálható eredmény = Iterables.filter (nevek, Predicates.containsPattern ("a")); assertThat (eredmény, tartalmazzaInAnyOrder ("Jane", "Adam")); }

Mint láthatja, szűrjük a Lista neveket, hogy csak azokat a neveket kapjuk, amelyek tartalmazzák az „a” karaktert - és ezt használjuk Iterables.filter () csinálni.

Alternatív megoldásként jól felhasználhatjuk Collections2.filter () API is:

@Test public void whenFilterWithCollections2_thenFiltered () {List names = Lists.newArrayList ("John", "Jane", "Adam", "Tom"); Gyűjtemény eredménye = Collections2.filter (nevek, Predicates.containsPattern ("a")); assertEquals (2, eredmény.méret ()); assertThat (eredmény, tartalmazzaInAnyOrder ("Jane", "Adam")); eredmény.add ("anna"); assertEquals (5, nevek.méret ()); }

Néhány dolog, amit itt meg kell jegyezni - először a kimenet Collections.filter () van élő nézet az eredeti gyűjteményről - az egyik változása a másikban is megmutatkozik.

Azt is fontos megérteni, hogy most, az eredményt az állítmány korlátozza - ha olyan elemet adunk hozzá, amely ezt nem elégíti ki Állítmány, an IllegalArgumentException dobni fogják:

@Test (várható = IllegalArgumentException.class) public void givenFilteredCollection_whenAddingInvalidElement_thenException () {Lista neve = Lists.newArrayList ("John", "Jane", "Adam", "Tom"); Gyűjtemény eredménye = Collections2.filter (nevek, Predicates.containsPattern ("a")); eredmény.add ("elvis"); }

3. Írja meg az Egyéni szűrőt Állítmány

Következő - írjuk meg a sajátunkat Állítmány ahelyett, hogy a könyvtár nyújtotta volna. A következő példában - meghatározunk egy predikátumot, amely csak az „A” vagy „J” betűvel kezdődő neveket kapja:

@Test public void whenFilterCollectionWithCustomPredicate_thenFiltered () {Predicate predicate = new Predicate () {@Orride public Boolean Apply (String input) return input.startsWith ("A")}; Listanevek = Lists.newArrayList ("John", "Jane", "Adam", "Tom"); Gyűjtemény eredménye = Gyűjtemények2.szűrő (nevek, állítmány); assertEquals (3, eredmény.méret ()); assertThat (eredmény, tartalmazzaInAnyOrder ("John", "Jane", "Adam")); }

4. Kombináljon több predikátumot

Több predikátumot kombinálhatunk Előrejelzés.vagy () és Előrejelzések.és ().

A következő példában - szűrjük a Lista nevekből, hogy megkapjuk azokat a neveket, amelyek „J” betűvel kezdődnek, vagy amelyek nem tartalmazzák az „a” -t:

@Test public void whenFilterUsingMultiplePredicates_thenFiltered () {List names = Lists.newArrayList ("John", "Jane", "Adam", "Tom"); Gyűjtemény eredménye = Collections2.filter (nevek, Predicates.vagy (Predicates.containsPattern ("J"), Predicates.not (Predicates.containsPattern ("a")))); assertEquals (3, eredmény.méret ()); assertThat (eredmény, tartalmazzaInAnyOrder ("John", "Jane", "Tom")); }

5. Távolítsa el a null értékeket a gyűjtemény szűrése közben

Tisztíthatjuk a nulla értékek egy gyűjteményből úgy, hogy azt szűrjük Predicates.notNull () mint a következő példában:

@Test public void whenRemoveNullFromCollection_thenRemoved () {List names = Lists.newArrayList ("John", null, "Jane", null, "Adam", "Tom"); Gyűjtemény eredménye = Collections2.filter (nevek, Predicates.notNull ()); assertEquals (4, eredmény.méret ()); assertThat (eredmény, tartalmazzaInAnyOrder ("John", "Jane", "Adam", "Tom")); }

6. Ellenőrizze, hogy a gyűjtemény összes eleme megfelel-e egy feltételnek

Ezután ellenőrizzük, hogy a Gyűjtemény összes eleme megfelel-e egy bizonyos feltételnek. Majd használjuk Iterables.all () hogy minden név tartalmaz-e „n” -et vagy „m” -et, akkor ellenőrizzük, hogy minden elem tartalmaz-e „a” -t:

@Test public void whenCheckingIfAllElementsMatchACondition_thenCorrect () m ")); assertTrue (result); result = Iterables.all (names, Predicates.containsPattern (" a ")); assertFalse (result); 

7. Gyűjtemény átalakítása

Most - nézzük meg, hogyan kell átalakítson egy gyűjteményt egy guava segítségével Funkció. A következő példában - átalakítjuk a Lista nevek a Lista nak,-nek Egész számok (a név hossza) a Iterables.transform ():

@Test public void whenTransformWithIterables_thenTransformed () {Function function = new Function () {@Orride public Integer Apply (String input) {return input.length (); }}; Listanevek = Lists.newArrayList ("John", "Jane", "Adam", "Tom"); Iterálható eredmény = Iterables.transform (nevek, függvény); assertThat (eredmény tartalmazza (4, 4, 4, 3)); }

Használhatjuk a Collections2.transform () API, mint a következő példában:

@Test public void whenTransformWithCollections2_thenTransformed () {Function func = new Function () {@Orride public Integer Apply (String input) {return input.length (); }}; Listanevek = Lists.newArrayList ("John", "Jane", "Adam", "Tom"); Gyűjtemény eredménye = Collections2.transform (nevek, func); assertEquals (4, eredmény.méret ()); assertThat (eredmény tartalmazza (4, 4, 4, 3)); eredmény.eltávolítás (3); assertEquals (3, nevek.méret ()); }

Vegye figyelembe, hogy a Collections.transform () van az eredeti élő nézete Gyűjtemény- az egyik változás megváltoztatja a másikat.

És - ugyanúgy, mint korábban -, ha megpróbálunk hozzáadni egy elemet a kimenethez Gyűjtemény, an UnsupportedOperationException dobni fogják.

8. Hozzon létre Funkció tól től Állítmány

Alkothatunk is Funkció a-tól Állítmány felhasználásával Functions.fromPredicate (). Ez természetesen egy olyan funkció lesz, amely átalakítja a bemeneteket Logikai, az állítmány állapota szerint.

A következő példában átalakítjuk a Lista nevek a logikai értékek listájába, ahol minden elem képviseli, ha a név „m” -t tartalmaz:

@Test public void whenCreatingAFunctionFromAPredicate_thenCorrect () {List names = Lists.newArrayList ("John", "Jane", "Adam", "Tom"); Gyűjtemény eredménye = Collections2.transform (nevek, Functions.forPredicate (Predicates.containsPattern ("m"))); assertEquals (4, eredmény.méret ()); assertThat (eredmény, tartalmazza (hamis, hamis, igaz, igaz)); }

9. Két funkció összetétele

Következő - vessünk egy pillantást arra, hogyan lehet átalakítani a gyűjteményt egy komponált felhasználásával Funkció.

Functions.compose () a két funkció összetételét adja vissza, mivel a másodikat alkalmazza Funkció az első kimenetén Funkció.

A következő példában - az első Funkció alakítsa át a nevet hosszává, majd a másodikká Funkció átalakítja a hosszát a-ra logikai érték, amely akkor felel meg, ha a név hossza páros:

@Test public void whenTransformingUsingComposedFunction_thenTransformed () {Function f1 = new Function () {@Orride public Integer Apply (String input) {return input.length (); }}; F2 = új függvény () {@Orride public Boolean Apply (Egész szám bemenet) {return input% 2 == 0; }}; Listanevek = Lists.newArrayList ("John", "Jane", "Adam", "Tom"); Gyűjtemény eredménye = Collections2.transform (nevek, Functions.compose (f2, f1)); assertEquals (4, eredmény.méret ()); assertThat (eredmény, tartalmazza (igaz, igaz, igaz, hamis)); }

10. Kombinálja a szűrést és az átalakítást

És most - nézzünk meg egy másik hűvös API-t, amely Guava-nak van - amely valóban lehetővé teszi számunkra, hogy együtt szűrjük és átalakítsuk a FluentIterable.

A következő példában - szűrjük a Lista nevek alakítják át FluentIterable:

@Test public void whenFilteringAndTransformingCollection_thenCorrect () {Predicate predicate = new Predicate () {@Orride public Boolean Apply (String input)}; Func = new Funkció () {@Orride public Integer Apply (String input) {return input.length (); }}; Listanevek = Lists.newArrayList ("John", "Jane", "Adam", "Tom"); Gyűjtemény eredménye = FluentIterable.from (names) .filter (predikátum) .transform (func) .toList (); assertEquals (2, eredmény.méret ()); assertThat (eredmény tartalmazza az InAnyOrder-t (4, 3)); }

Érdemes megemlíteni, hogy egyes esetekben az elengedhetetlen változat olvashatóbb, és előnyben kell részesíteni a funkcionális megközelítés helyett.

11. Következtetés

Végül megtanultuk a gyűjtemények szűrését és átalakítását a Guava használatával. Használtuk a Collections2.filter () és Iterables.filter () API-k a szűréshez, valamint Collections2.transform () és Iterables.transform () gyűjtemények átalakítására.

Végül egy gyors pillantást vetettünk a nagyon érdekesre FluentIterable folyékony API a szűrés és az átalakítás kombinálásához.

Mindezen példák és kódrészletek megvalósítása megtalálható a GitHub projektben - ez egy Maven-alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.