Java Stream Filter med Lambda Expression

1. Introduksjon

I denne raske opplæringen vil vi utforske bruken av Stream.filter () metode når vi jobber med Strømmer i Java.

Vi ser på hvordan du bruker den, og hvordan vi håndterer spesielle tilfeller med avmerkede unntak.

2. Bruke Stream.filter ()

De filter() metoden er en mellomliggende operasjon av Strøm grensesnitt som lar oss filtrere elementer i en strøm som samsvarer med en gitt Predikat:

Stream filter (Predicate predicate)

For å se hvordan dette fungerer, la oss lage en Kunde klasse:

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

I tillegg, la oss lage en samling kunder:

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

2.1. Filtrering av samlinger

En vanlig brukstilfelle for filter() metoden er behandling av samlinger.

La oss lage en liste over kunder med mer enn 100 poeng. For å gjøre det kan vi bruke et lambdauttrykk:

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

Vi kan også bruke en referanse til metoden, som er stenografi for et lambdauttrykk:

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

I dette tilfellet la vi til hasOverHundredPoints metode til vår Kunde klasse:

public boolean hasOverHundredPoints () {return this.points> 100; }

I begge tilfeller får vi det samme resultatet:

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

2.2. Filtrering av samlinger med flere kriterier

Videre kan vi bruke flere forhold med filter(). For eksempel kan vi filtrere etter poeng og Navn:

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

3. Håndtering av unntak

Inntil nå har vi brukt filteret med predikater som ikke gir unntak. Faktisk, den funksjonelle grensesnitt i Java erklærer ikke merkede eller ukontrollerte unntak.

Deretter skal vi vise noen forskjellige måter å håndtere unntak i lambdauttrykk på.

3.1. Bruke en tilpasset innpakning

Først begynner vi med å legge til en profilFotoUrl til vår Kunde:

privat strengprofilPhotoUrl;

I tillegg, la oss legge til en enkel hasValidProfilePhoto () metode for å sjekke tilgjengeligheten av profilen:

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

Vi kan se at hasValidProfilePhoto () metoden kaster en IO Unntak. Nå hvis vi prøver å filtrere kundene med denne metoden:

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

Vi får se følgende feil:

Inkompatible kastede typer java.io.IO Unntak i funksjonelt uttrykk

For å håndtere det, er et av alternativene vi kan bruke å pakke det inn med en prøvefangstblokk:

Liste kunderWithValidProfilePhoto = kunder .stream () .filter (c -> {prøv {return c.hasValidProfilePhoto ();} fangst (IOException e) {// håndtak unntak} returner false;}) .collect (Collectors.toList ()) ;

Hvis vi trenger å kaste et unntak fra predikatet vårt, kan vi pakke det inn i et ukontrollert unntak som RuntimeException.

3.2. Bruke ThrowingFunction

Alternativt kan vi bruke ThrowingFunction-biblioteket.

ThrowingFunction er et bibliotek med åpen kildekode som lar oss håndtere sjekket unntak i Java-funksjonelle grensesnitt.

La oss starte med å legge til kaste-funksjon avhengighet til vår pom:

 pl.touk-kaste-funksjon 1.3 

For å håndtere unntak i predikater, tilbyr dette biblioteket oss ThrowingPredicate klasse, som har ukontrollert () metode for å pakke sjekket unntak.

La oss se det i aksjon:

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

4. Konklusjon

I denne artikkelen så vi et eksempel på hvordan du bruker filter() metode for å behandle strømmer. Vi har også undersøkt noen alternativer for å håndtere unntak.

Som alltid er den komplette koden tilgjengelig på GitHub.


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