Java adatfolyam-szűrő Lambda kifejezéssel

1. Bemutatkozás

Ebben a gyors bemutatóban megvizsgáljuk a Stream.filter () módszer, amikor dolgozunk Patakok Java-ban.

Megvizsgáljuk, hogyan kell használni, és hogyan kell kezelni a speciális eseteket bejelölt kivételekkel.

2. Használata Stream.filter ()

A szűrő() módszer a Folyam felület, amely lehetővé teszi számunkra, hogy egy adatfolyamnak egy adott elemnek megfelelő elemeit szűrjük Állítmány:

Patak szűrő (predikátum predikátum)

Hogy lássuk, hogyan működik ez, hozzunk létre egy Vevő osztály:

public class Ügyfél {private String name; magán int pontok; // Konstruktor és szabványos szerelvények}

Hozzon létre ezen kívül egy ügyfelek gyűjteményét:

Vevő john = new Customer ("John P.", 15); Ügyfél sarah = új Ügyfél ("Sarah M.", 200); Ügyfél charles = új Ügyfél ("Charles B.", 150); Vevő mary = új vevő ("Mary T.", 1); Ügyféllista = Arrays.asList (john, sarah, charles, mary);

2.1. Gyűjtemények szűrése

A szűrő() módszer a gyűjtemények feldolgozása.

Készítsünk egy listát a 100-nál több vásárlóról pontokat. Ehhez használhatunk lambda kifejezést:

Sorolja fel az ügyfeleketWithMoreThan100Points = ügyfelek .stream () .filter (c -> c.getPoints ()> 100) .collect (Collectors.toList ());

Használhatunk egy módszer referenciát is, amely a lambda kifejezés rövidítése:

Sorolja fel az ügyfeleketWithMoreThan100Points = ügyfelek .stream () .filter (Ügyfél :: hasOverHundredPoints) .collect (Collectors.toList ());

Ebben az esetben hozzáadtuk a hasOverHundredPoints módszer a mi Vevő osztály:

nyilvános logikai hasOverHundredPoints () {adja vissza ezt.pont> 100; }

Mindkét esetben ugyanazt az eredményt kapjuk:

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

2.2. Gyűjtemények szűrése több kritériummal

Ezenkívül több feltételt is használhatunk a szűrő(). Például szűrhetünk pontokat és név:

A charlesWithMoreThan100Points = ügyfelek .stream () .filter (c -> c.getPoints ()> 100 && c.getName (). StartsWith ("Charles")) .collect (Collectors.toList ()); assertThat (charlesWithMoreThan100Points) .hasSize (1); assertThat (charlesWithMoreThan100Points). tartalmaz (charles);

3. Kivételek kezelése

Mostanáig olyan predikátumokkal használtuk a szűrőt, amelyek nem vetnek ki kivételt. Valóban, a a Java funkcionális interfészei nem jelentenek bejelölt vagy be nem jelölt kivételt.

Ezután bemutatjuk a lambda kifejezésekben a kivételek kezelésének néhány különböző módját.

3.1. Egyedi burkoló használata

Először egy a hozzáadásával kezdjük profilePhotoUrl a miénknek Vevő:

privát karakterlánc-profilPhotoUrl;

Emellett tegyünk hozzá egy egyszerűt hasValidProfilePhoto () módszer a profil elérhetőségének ellenőrzésére:

public logikai hasValidProfilePhoto () dobja az IOException {URL url = új URL (this.profilePhotoUrl); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection (); return connection.getResponseCode () == HttpURLConnection.HTTP_OK; }

Láthatjuk, hogy a hasValidProfilePhoto () módszer dob egy IOException. Ha ezzel a módszerrel próbáljuk kiszűrni az ügyfeleket:

Sorolja fel az ügyfeleketWithValidProfilePhoto = ügyfelek .stream () .filter (Ügyfél :: hasValidProfilePhoto) .collect (Collectors.toList ());

A következő hibát fogjuk látni:

Kompatibilis dobott típusok java.io.IOException a funkcionális kifejezésben

Kezeléséhez az egyik alternatíva, amelyet használhatunk, egy becsapási próba blokkolás:

Sorolja fel az ügyfeleketWithValidProfilePhoto = customers .stream () .filter (c -> {try {return c.hasValidProfilePhoto ();} catch (IOException e) {// kezelés kivétel} return false;}) .collect (Collectors.toList ()) ;

Ha ki kell dobnunk egy kivételt az állítmányunkból, be tudjuk csomagolni egy ellenőrizetlen kivételbe, mint például RuntimeException.

3.2. A ThrowingFunction használatával

Alternatív megoldásként használhatjuk a ThrowingFunction könyvtárat is.

A ThrowingFunction egy nyílt forráskódú könyvtár, amely lehetővé teszi számunkra az ellenőrzött kivételek kezelését a Java funkcionális interfészekben.

Kezdjük azzal, hogy hozzáadjuk a dobás-funkció függőség a pom-tól:

 pl.touk dobás-funkció 1.3 

A kivételeknek az predikátumokban történő kezeléséhez ez a könyvtár a következőket kínálja nekünk: ThrowingPredicate osztály, amelynek a nem ellenőrzött () módszer bejelölni az ellenőrzött kivételeket.

Lássuk működés közben:

Sorolja fel az ügyfeleketWithValidProfilePhoto = ügyfelek .stream () .filter (ThrowingPredicate.unchecked (Ügyfél :: hasValidProfilePhoto)) .collect (Collectors.toList ());

4. Következtetés

Ebben a cikkben láttunk egy példát a szűrő() módszer a folyamok feldolgozására. A kivételek kezelésének néhány alternatíváját is megvizsgáltuk.

Mint mindig, a teljes kód elérhető a GitHubon.


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