Sådan filtreres en samling i Java

1. Oversigt

I denne korte vejledning vi ser på forskellige måder at filtrere en samling på Java - det vil sige at finde alle de emner, der opfylder en bestemt betingelse.

Dette er en grundlæggende opgave, der findes i praktisk talt enhver Java-applikation.

Af denne grund er antallet af biblioteker, der leverer funktionalitet til dette formål, betydeligt.

Især i denne vejledning dækker vi:

  • Java 8 Streams ' filter() fungere
  • Java 9 filtrering samler
  • Relevant Formørkelsessamlinger API'er
  • Apache's CollectionUtils filter () metode
  • Guava Collections2 filter () nærme sig

2. Brug af streams

Siden Java 8 blev introduceret, har Streams fået en nøglerolle i de fleste tilfælde, hvor vi skal behandle en indsamling af data.

Derfor er dette den foretrukne tilgang i de fleste tilfælde, da den er bygget i Java og ikke kræver yderligere afhængigheder.

2.1. Filtrering af en samling med Strømme

For enkelhedens skyld, i alle eksemplerne vil vores mål være at skabe en metode, der kun henter lige tal fra a Kollektion af Heltal værdier.

Således kan vi udtrykke den betingelse, som vi bruger til at evaluere hver vare som 'værdi% 2 == 0‘.

I alle tilfælde bliver vi nødt til at definere denne betingelse som en Prædikat objekt:

offentlig samling findEvenNumbers (Collection baseCollection) {Predicate streamsPredicate = item -> item% 2 == 0; return baseCollection.stream () .filter (streamsPredicate) .collect (Collectors.toList ()); }

Det er vigtigt at bemærke det hvert bibliotek, vi analyserer i denne vejledning, giver sit eget Prædikat implementering, men alligevel er alle defineret som funktionelle grænseflader, så vi tillader os at bruge Lambda-funktioner til at erklære dem.

I dette tilfælde brugte vi en foruddefineret Samler leveret af Java, der akkumulerer elementerne i en Liste, men vi kunne have brugt andre som beskrevet i dette tidligere indlæg.

2.2. Filtrering efter gruppering af en samling i Java 9

Streams giver os mulighed for at samle varer ved hjælp af gruppering Af samler.

Alligevel, hvis vi filtrerer som i sidste afsnit, kan nogle elementer blive kasseret i et tidligt stadium, før denne samler kommer i spil.

Af denne grund, det filtrering samler blev introduceret med Java 9 med det formål at behandle undersamlingerne, efter at de er blevet grupperet.

Lad os forestille os, at vi efter vores eksempel vil gruppere vores samling baseret på antallet af cifre, som hvert heltal har, inden vi filtrerer de ulige tal ud:

offentligt kort findEvenNumbersAfterGrouping (Collection baseCollection) {Function getQuantityOfDigits = item -> (int) Math.log10 (item) + 1; return baseCollection.stream () .collect (groupingBy (getQuantityOfDigits, filtrering (item -> item% 2 == 0, toList ()))); }

Kort sagt, hvis vi bruger denne samler, kan vi ende med en tom værdipost, mens hvis vi filtrerer inden gruppering, ville samleren slet ikke oprette en sådan post.

Selvfølgelig ville vi vælge tilgangen baseret på vores krav.

3. Brug Formørkelsessamlinger

Vi kan også bruge nogle andre tredjepartsbiblioteker til at nå vores mål, enten hvis det er fordi vores applikation ikke understøtter Java 8, eller fordi vi ønsker at drage fordel af nogle kraftige funktioner, der ikke leveres af Java.

Sådan er tilfældet med Formørkelsessamlinger, et bibliotek, der stræber efter at holde trit med de nye paradigmer, udvikle sig og omfavne de ændringer, der er introduceret i alle de nyeste Java-udgivelser.

Vi kan begynde med at udforske vores introduktionsindlæg til Eclipse Collections for at få en bredere viden om funktionaliteten i dette bibliotek.

3.1. Afhængigheder

Lad os begynde med at tilføje følgende afhængighed til vores projekt pom.xml:

 org.eclipse.collections formørkelsessamlinger 9.2.0 

Det formørkelsessamlinger inkluderer alle de nødvendige datastrukturgrænseflader og selve API'en.

3.2. Filtrering af en samling med Formørkelsessamlinger

Lad os nu bruge formørkels filtreringsfunktionalitet på en af ​​dens datastrukturer, såsom dens MutableList:

offentlig samling findEvenNumbers (Collection baseCollection) {Predicate eclipsePredicate = item -> item% 2 == 0; Samling filteredList = Lists.mutable .ofAll (baseCollection) .select (eclipsePredicate); return filteredList; }

Som et alternativ kunne vi have brugt Iterere'S Vælg()statisk metode til at definere filteredList objekt:

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

4. Brug af Apache's CollectionUtils

For at komme i gang med Apache's CollectionUtils bibliotek, kan vi tjekke denne korte vejledning, hvor vi dækkede dens anvendelser.

I denne vejledning fokuserer vi dog på dens filter() implementering.

4.1. Afhængigheder

Først skal vi bruge følgende afhængigheder i vores pom.xml fil:

 org.apache.commons commons-collection4 4.2 

4.2. Filtrering af en samling med CollectionUtils

Vi er nu klar til at bruge CollectonUtils' metoder:

offentlig samling findEvenNumbers (Collection baseCollection) {Predicate apachePredicate = item -> item% 2 == 0; CollectionUtils.filter (baseCollection, apachePredicate); return baseCollection; }

Vi er nødt til at tage højde for, at denne metode ændrer baseCollection ved at fjerne alle genstande, der ikke matcher betingelsen.

Det betyder at basesamlingen skal kunne ændres, ellers kaster den en undtagelse.

5. Brug af Guava Samlinger2

Som før kan vi læse vores tidligere indlæg 'Filtrering og transformation af samlinger i Guava' for yderligere information om dette emne.

5.1. Afhængigheder

Lad os starte med at tilføje denne afhængighed i vores pom.xml fil:

 com.google.guava guava 25.1-jre 

5.2. Filtrering af en samling med Samlinger2

Som vi kan se, ligner denne tilgang nogenlunde den, der blev fulgt i sidste afsnit:

offentlig samling findEvenNumbers (Collection baseCollection) {Predicate guavaPredicate = item -> item% 2 == 0; returner Collections2.filter (baseCollection, guavaPredicate); }

Igen definerer vi her en Guava-specifik Prædikat objekt.

I dette tilfælde ændrer Guava ikke baseCollection, det genererer en ny, så vi kan bruge en uforanderlig samling som input.

6. Konklusion

Sammenfattende har vi set, at der er mange forskellige måder at filtrere samlinger i Java på.

Selvom Streams normalt er den foretrukne tilgang, er det godt at kende og huske på funktionaliteten, der tilbydes af andre biblioteker.

Især hvis vi har brug for at støtte ældre Java-versioner. Men hvis dette er tilfældet, er vi nødt til at huske på, at nylige Java-funktioner, der bruges i hele tutorialen, såsom lambdas skal erstattes med anonyme klasser.

Som sædvanligt kan vi finde alle eksemplerne vist i denne vejledning i vores Github repo.


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