Java Stream Filter s Lambda Expression

1. Uvod

U ovom brzom vodiču istražit ćemo upotrebu Stream.filter () metoda kada radimo s Potoci na Javi.

Pogledat ćemo kako ga koristiti i kako postupati u posebnim slučajevima s provjerenim iznimkama.

2. Korištenje Stream.filter ()

The filtar() metoda je posredna operacija Stream sučelje koje nam omogućuje filtriranje elemenata toka koji odgovaraju zadanom Predikat:

Filtar streama (predikat predikata)

Da bismo vidjeli kako ovo funkcionira, stvorimo a Kupac razred:

kupac javne klase {naziv privatnog niza; privatne int točke; // Konstruktor i standardni getteri}

Uz to, kreirajmo kolekciju kupaca:

Kupac john = novi kupac ("John P.", 15); Kupac sarah = novi kupac ("Sarah M.", 200); Kupac charles = novi kupac ("Charles B.", 150); Kupac mary = novi kupac ("Mary T.", 1); Popis kupaca = Arrays.asList (john, sarah, charles, mary);

2.1. Filtriranje zbirki

Uobičajeni slučaj upotrebe filtar() metoda je obrada zbirki.

Napravimo popis kupaca s više od 100 bodova. Da bismo to učinili, možemo koristiti lambda izraz:

Popis kupacaWithMoreThan100Points = kupci .stream () .filter (c -> c.getPoints ()> 100) .collect (Collectors.toList ());

Također se možemo poslužiti referencom metode, koja je skraćenica za lambda izraz:

Popis kupacaWithMoreThan100Points = kupci .stream () .filter (Customer :: hasOverHundredPoints) .collect (Collectors.toList ());

U ovom smo slučaju dodali hasOverHundredPoints metoda do našeg Kupac razred:

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

U oba slučaja dobivamo isti rezultat:

assertThat (customersWithMoreThan100Points) .hasSize (2); assertThat (customersWithMoreThan100Points) .sadrži (sarah, charles);

2.2. Filtriranje zbirki s više kriterija

Nadalje, možemo koristiti više uvjeta s filtar(). Na primjer, možemo filtrirati prema bodova i Ime:

Popis charlesWithMoreThan100Points = kupci .stream () .filter (c -> c.getPoints ()> 100 && c.getName (). StartWith ("Charles")) .collect (Collectors.toList ()); assertThat (charlesWithMoreThan100Points) .hasSize (1); assertThat (charlesWithMoreThan100Points) .sadrži (charles);

3. Rukovanje iznimkama

Do sada smo filtar upotrebljavali s predikatima koji ne izuzimaju iznimku. Doista, funkcionalna sučelja u Javi ne prijavljuju nikakve provjerene ili neprovjerene iznimke.

Dalje ćemo pokazati nekoliko različitih načina za rukovanje iznimkama u lambda izrazima.

3.1. Korištenje prilagođenog omota

Prvo ćemo započeti dodavanjem a profilePhotoUrl našem Kupac:

private String profilePhotoUrl;

Uz to, dodajmo jednostavan hasValidProfilePhoto () metoda za provjeru dostupnosti profila:

javni boolean hasValidProfilePhoto () baca IOException {URL url = novi URL (this.profilePhotoUrl); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection (); vratiti vezu.getResponseCode () == HttpURLConnection.HTTP_OK; }

Možemo vidjeti da je hasValidProfilePhoto () metoda baca an IOException. Sada, ako pokušamo filtrirati kupce ovom metodom:

Navesti kupceWithValidProfilePhoto = kupci .stream () .filter (Customer :: hasValidProfilePhoto) .collect (Collectors.toList ());

Vidjet ćemo sljedeću pogrešku:

Nekompatibilni bačeni tipovi java.io.IOException u funkcionalnom izrazu

Da bismo to riješili, jedna od alternativa koju možemo koristiti je omotanje blokom try-catch:

Navesti customersWithValidProfilePhoto = kupci .stream () .filter (c -> {try {return c.hasValidProfilePhoto ();} catch (IOException e) {// handle exception} return false;}) .collect (Collectors.toList ()) ;

Ako trebamo izuzeti izuzetak iz našeg predikata, možemo ga umotati u neprovjerenu iznimku poput RuntimeException.

3.2. Korištenje funkcije ThrowingFunction

Alternativno, možemo koristiti knjižnicu ThrowingFunction.

ThrowingFunction je biblioteka otvorenog koda koja nam omogućuje obradu provjerenih iznimaka u Java funkcionalnim sučeljima.

Krenimo dodavanjem funkcija bacanja ovisnost o našoj pom:

 pl.troj funkcija bacanja 1.3 

Da bismo obradili iznimke u predikatima, ova nam knjižnica nudi ThrowingPredicate razred, koji ima neoznačeno () metoda zamotavanja provjerenih iznimaka.

Pogledajmo na djelu:

Navesti kupceWithValidProfilePhoto = kupci .stream () .filter (ThrowingPredicate.un провеreno (Customer :: hasValidProfilePhoto)) .collect (Collectors.toList ());

4. Zaključak

U ovom smo članku vidjeli primjer kako se koristi filtar() metoda za obradu tokova. Također smo istražili neke alternative za rukovanje iznimkama.

Kao i uvijek, cjeloviti kôd dostupan je na GitHub-u.


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