Filter toku údajov Java s výrazom lambda

1. Úvod

V tomto rýchlom výučbe preskúmame použitie Stream.filter () metóda, keď pracujeme s Prúdy v Jave.

Pozrime sa na to, ako ho používať, a ako zaobchádzať so špeciálnymi prípadmi so začiarknutými výnimkami.

2. Pomocou Stream.filter ()

The filter () metóda je prechodnou operáciou Prúd rozhranie, ktoré nám umožňuje filtrovať prvky streamu, ktoré sa zhodujú s daným Predikát:

Filter streamu (predikát predikátu)

Aby sme videli, ako to funguje, vytvorme a Zákazník trieda:

public class Customer {private String name; súkromné ​​int body; // Konštruktor a štandardné getre}

Okrem toho vytvorme kolekciu zákazníkov:

Zákazník john = nový zákazník („John P.“, 15); Zákazník sarah = nový zákazník („Sarah M.“, 200); Charles charles = nový zákazník („Charles B.“, 150); Zákazníčka mary = nová zákazníčka („Mary T.“, 1); Zoznam zákazníkov = Arrays.asList (john, sarah, charles, mary);

2.1. Filtrovanie zbierok

Bežný prípad použitia filter () metóda je spracovanie zbierok.

Urobme zoznam zákazníkov s viac ako 100 bodov. Na to môžeme použiť výraz lambda:

Zoznam customersWithMoreThan100Points = zákazníci .stream () .filter (c -> c.getPoints ()> 100) .collect (Collectors.toList ());

Môžeme tiež použiť odkaz na metódu, ktorý je skratkou pre výraz lambda:

Zoznam customersWithMoreThan100Points = zákazníci .stream () .filter (Customer :: hasOverHundredPoints) .collect (Collectors.toList ());

V tomto prípade sme pridali hasOverHundredPoints metóda k našej Zákazník trieda:

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

V oboch prípadoch dostaneme rovnaký výsledok:

assertThat (customersWithMoreThan100Points) .hasSize (2); assertThat (customersWithMoreThan100Points) .obsahuje (Sarah, Charles);

2.2. Filtrovanie zbierok s viacerými kritériami

Ďalej môžeme použiť viac podmienok s filter (). Môžeme napríklad filtrovať podľa bodov a názov:

Zoznam charlesWithMoreThan100Points = customers .stream () .filter (c -> c.getPoints ()> 100 && c.getName (). StartsWith ("Charles")) .collect (Collectors.toList ()); assertThat (charlesWithMoreThan100Points) .hasSize (1); assertThat (charlesWithMoreThan100Points) .obsahuje (charles);

3. Spracovanie výnimiek

Doteraz sme filter používali s predikátmi, ktoré nevyvolávajú výnimku. Skutočne funkčné rozhrania v Jave nedeklarujú žiadne kontrolované ani nekontrolované výnimky.

Ďalej si ukážeme niekoľko rôznych spôsobov spracovania výnimiek vo výrazoch lambda.

3.1. Používanie vlastnej ovíjačky

Najskôr začneme pridaním a profilePhotoUrl k nášmu Zákazník:

private String profilePhotoUrl;

Okrem toho pridajme jednoduchý hasValidProfilePhoto () metóda na overenie dostupnosti profilu:

public boolean hasValidProfilePhoto () vyvolá IOException {URL url = nová URL (this.profilePhotoUrl); HttpsURLConnection pripojenie = (HttpsURLConnection) url.openConnection (); návrat connection.getResponseCode () == HttpURLConnection.HTTP_OK; }

Môžeme vidieť, že hasValidProfilePhoto () metóda hodí Výnimka IO. Teraz, keď sa pokúsime filtrovať zákazníkov touto metódou:

Zoznam customersWithValidProfilePhoto = customers .stream () .filter (Customer :: hasValidProfilePhoto) .collect (Collectors.toList ());

Uvidíme nasledujúcu chybu:

Nekompatibilné vyvolané typy java.io.IOException vo funkčnom výraze

Jednou z alternatív, ktorú môžeme použiť, je zabaliť ju do bloku try-catch:

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

Ak potrebujeme hodiť výnimku z nášho predikátu, môžeme ju zabaliť do nezaškrtnutej výnimky typu RuntimeException.

3.2. Používanie funkcie ThrowingFunction

Prípadne môžeme použiť knižnicu ThrowingFunction.

ThrowingFunction je knižnica otvoreného zdroja, ktorá nám umožňuje spracovávať skontrolované výnimky vo funkčných rozhraniach Java.

Začnime pridaním vrhacia funkcia závislosť na našom pom:

 pl.touk vrhacia funkcia 1.3 

Táto knižnica nám umožňuje spracovávať výnimky v predikátoch ThrowingPredicate triedy, ktorá má nezaškrtnuté () metóda zabalenia kontrolovaných výnimiek.

Pozrime sa na to v akcii:

Zoznam customersWithValidProfilePhoto = customers .stream () .filter (ThrowingPredicate.unchecked (Customer :: hasValidProfilePhoto)) .collect (Collectors.toList ());

4. Záver

V tomto článku sme videli príklad toho, ako používať filter () metóda na spracovanie prúdov. Preskúmali sme tiež niektoré alternatívy riešenia výnimiek.

Celý kód je ako vždy k dispozícii na stránkach GitHub.


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