Java Stream Filter med Lambda Expression

1. Introduktion

I denne hurtige vejledning undersøger vi brugen af Stream.filter () metode, når vi arbejder med Strømme i Java.

Vi ser på, hvordan du bruger det, og hvordan vi håndterer specielle sager med afmærkede undtagelser.

2. Brug Stream.filter ()

Det filter() metoden er en mellemliggende operation af Strøm interface, der giver os mulighed for at filtrere elementer i en stream, der matcher en given Prædikat:

Stream filter (Predicate predicate)

Lad os oprette en for at se, hvordan dette fungerer Kunde klasse:

offentlig klasse kunde {privat strengnavn; private int-punkter; // Constructor og standard getters}

Lad os desuden oprette en samling kunder:

Kunde john = ny kunde ("John P.", 15); Kundesarah = ny kunde ("Sarah M.", 200); Customer charles = ny kunde ("Charles B.", 150); Kundemary = ny kunde ("Mary T.", 1); Liste kunder = Arrays.asList (john, sarah, charles, mary);

2.1. Filtrering af samlinger

En almindelig anvendelse af filter() metoden er behandling af samlinger.

Lad os lave en liste over kunder med mere end 100 point. For at gøre det kan vi bruge et lambda-udtryk:

Vis kunderWithMoreThan100Points = kunder .stream () .filter (c -> c.getPoints ()> 100) .collect (Collectors.toList ());

Vi kan også bruge en metodehenvisning, der er stenografi for et lambda-udtryk:

Vis kunderWithMoreThan100Points = kunder .stream () .filter (kunde :: hasOverHundredPoints) .collect (Collectors.toList ());

I dette tilfælde tilføjede vi hasOverHundredPoints metode til vores Kunde klasse:

public boolean hasOverHundredPoints () {returner dette. point> 100; }

I begge tilfælde får vi det samme resultat:

assertThat (customersWithMoreThan100Points) .hasSize (2); assertThat (customersWithMoreThan100Points). indeholder (sarah, charles);

2.2. Filtrering af samlinger med flere kriterier

Desuden kan vi bruge flere betingelser med filter(). For eksempel kan vi filtrere efter point og navn:

Liste charlesWithMoreThan100Points = kunder .stream () .filter (c -> c.getPoints ()> 100 && c.getName (). StartsMed ("Charles")) .collect (Collectors.toList ()); assertThat (charlesWithMoreThan100Points) .hasSize (1); assertThat (charlesWithMoreThan100Points). indeholder (charles);

3. Håndtering af undtagelser

Indtil nu har vi brugt filteret med prædikater, der ikke kaster en undtagelse. Faktisk funktionelle grænseflader i Java erklærer ikke kontrollerede eller ukontrollerede undtagelser.

Dernæst skal vi vise nogle forskellige måder at håndtere undtagelser i lambda-udtryk på.

3.1. Brug af en brugerdefineret indpakning

Først begynder vi med at tilføje en profilFotoUrl til vores Kunde:

privat streng profilPhotoUrl;

Lad os derudover tilføje en simpel hasValidProfilePhoto () metode til at kontrollere tilgængeligheden af ​​profilen:

offentlig boolsk hasValidProfilePhoto () kaster IOException {URL url = ny URL (this.profilePhotoUrl); HttpsURLConnection forbindelse = (HttpsURLConnection) url.openConnection (); returner connection.getResponseCode () == HttpURLConnection.HTTP_OK; }

Vi kan se, at hasValidProfilePhoto () metode kaster en IOUndtagelse. Nu hvis vi forsøger at filtrere kunderne med denne metode:

Vis kunderWithValidProfilePhoto = kunder .stream () .filter (kunde :: hasValidProfilePhoto) .collect (Collectors.toList ());

Vi får vist følgende fejl:

Inkompatible kastede typer java.io.IOUndtagelse i funktionelt udtryk

For at håndtere det er et af de alternativer, vi kan bruge, at pakke det med en try-catch-blok:

Vis kunderWithValidProfilePhoto = kunder .stream () .filter (c -> {prøv {return c.hasValidProfilePhoto ();} fang (IOException e) {// håndtag undtagelse} returner false;}) .collect (Collectors.toList ()) ;

Hvis vi har brug for at kaste en undtagelse fra vores prædikat, kan vi pakke den ind i en ukontrolleret undtagelse som RuntimeException.

3.2. Brug af ThrowingFunction

Alternativt kan vi bruge ThrowingFunction-biblioteket.

ThrowingFunction er et open source-bibliotek, der giver os mulighed for at håndtere kontrollerede undtagelser i Java-funktionelle grænseflader.

Lad os starte med at tilføje kastefunktion afhængighed af vores pom:

 pl.touk-kaste-funktion 1.3 

For at håndtere undtagelser i prædikater tilbyder dette bibliotek os ThrowingPredicate klasse, som har ikke markeret () metode til at pakke afkrydsede undtagelser.

Lad os se det i aktion:

Vis kunderWithValidProfilePhoto = kunder .stream () .filter (ThrowingPredicate.unchecked (kunde :: hasValidProfilePhoto)) .collect (Collectors.toList ());

4. Konklusion

I denne artikel så vi et eksempel på, hvordan du bruger filter() metode til behandling af streams. Vi undersøgte også nogle alternativer til håndtering af undtagelser.

Som altid er den komplette kode tilgængelig på GitHub.


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