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.