מסנן Java Stream עם ביטוי Lambda

1. הקדמה

במדריך מהיר זה, נחקור את השימוש ב- Stream.filter () שיטה כשאנחנו עובדים עם זרמים בג'אווה.

נבדוק כיצד להשתמש בו וכיצד לטפל במקרים מיוחדים למעט חריגים מסומנים.

2. שימוש Stream.filter ()

ה לְסַנֵן() שיטה היא פעולת ביניים של זרם ממשק המאפשר לנו לסנן אלמנטים של זרם התואמים נתון לְבַסֵס:

מסנן זרם (חזוי פרדיקט)

כדי לראות איך זה עובד, בואו ליצור צרכן מעמד:

לקוח ממעמד ציבורי {שם מחרוזת פרטי; נקודות אינטימיות פרטיות; // בנאי וגטרים סטנדרטיים}

בנוסף, בואו ליצור אוסף של לקוחות:

לקוח ג'ון = לקוח חדש ("John P.", 15); שרה לקוח = לקוח חדש ("שרה מ ', 200); הלקוח charles = לקוח חדש ("צ'ארלס ב ', 150); לקוח מרי = לקוח חדש ("מרי ת.", 1); רשימת לקוחות = Arrays.asList (ג'ון, שרה, צ'רלס, מרי);

2.1. סינון אוספים

מקרה שימוש נפוץ של לְסַנֵן() השיטה היא עיבוד אוספים.

בואו נערוך רשימה של לקוחות עם יותר מ -100 נקודות. לשם כך נוכל להשתמש בביטוי למבדה:

רשימת לקוחותWithMoreThan100Points = לקוחות .stream () .filter (c -> c.getPoints ()> 100) .collect (Collectors.toList ());

אנו יכולים גם להשתמש בהתייחסות לשיטה שהיא ראייה קצרה לביטוי למבדה:

רשימת לקוחותWithMoreThan100Points = לקוחות .stream () .filter (לקוח :: hasOverHundredPoints) .collect (Collectors.toList ());

במקרה זה, הוספנו את hasOverHundredPoints שיטה שלנו צרכן מעמד:

hasOverHundredPoints () בוליאני ציבורי () {להחזיר this.points> 100; }

בשני המקרים, אנו מקבלים את אותה התוצאה:

assertThat (clientsWithMoreThan100Points) .hasSize (2); assertThat (clientsWithMoreThan100Points). מכיל (שרה, צ'רלס);

2.2. סינון אוספים עם קריטריונים מרובים

יתר על כן, אנו יכולים להשתמש בתנאים מרובים עם לְסַנֵן(). לדוגמה, נוכל לסנן לפי נקודות ו שֵׁם:

רשימת charlesWithMoreThan100Points = לקוחות .stream () .filter (c -> c.getPoints ()> 100 && c.getName (). StartsWith ("Charles")) .collect (Collectors.toList ()); assertThat (charlesWithMoreThan100Points) .hasSize (1); assertThat (charlesWithMoreThan100Points). מכיל (charles);

3. טיפול בחריגים

עד כה השתמשנו במסנן עם פרדיקטים שאינם יוצאים מהכלל חריג. אכן, ה ממשקים פונקציונליים ב- Java אינם מצהירים על חריגים מסומנים או לא מסומנים.

בהמשך נציג כמה דרכים שונות להתמודד עם חריגים בביטויי למבדה.

3.1. שימוש בעטיפה בהתאמה אישית

ראשית, נתחיל בהוספת א profilePhotoUrl שלנו צרכן:

פרופיל מחרוזת פרטי PhotoUrl;

בנוסף, בואו להוסיף פשוט hasValidProfilePhoto () שיטה לבדיקת זמינות הפרופיל:

hasValidProfilePhoto () בוליאני ציבורי זורק IOException {URL url = URL חדש (this.profilePhotoUrl); חיבור HttpsURLConnection = (HttpsURLConnection) url.openConnection (); החזר connection.getResponseCode () == HttpURLConnection.HTTP_OK; }

אנו יכולים לראות כי hasValidProfilePhoto () שיטה זורקת IOException. עכשיו אם ננסה לסנן את הלקוחות בשיטה זו:

רשימת לקוחותWithValidProfilePhoto = לקוחות .stream () .filter (לקוח :: hasValidProfilePhoto) .collect (Collectors.toList ());

נראה את השגיאה הבאה:

סוגים מושלכים שאינם תואמים java.io.IO חריג בביטוי פונקציונלי

כדי להתמודד עם זה, אחת החלופות שבהן אנו יכולים להשתמש היא לעטוף אותו בלוק תפוס:

רשימת לקוחותWithValidProfilePhoto = לקוחות .stream () .filter (c -> {try {return c.hasValidProfilePhoto ();} catch (IOException e) {// handle exception} return false;}) .collect (Collectors.toList ()) ;

אם עלינו לזרוק חריג מהפרדיקט שלנו, נוכל לעטוף אותו בחריג לא מסומן כמו חריגת זמן ריצה.

3.2. באמצעות ThrowingFunction

לחלופין, אנו יכולים להשתמש בספריית ThrowingFunction.

ThrowingFunction היא ספריית קוד פתוח המאפשרת לנו לטפל בחריגים מסומנים בממשקים פונקציונליים של Java.

נתחיל בהוספת ה- זריקת פונקציה תלות לפום שלנו:

 פונקצית השלכת pl.touk 1.3 

כדי להתמודד עם חריגים בפרדיקטים, ספרייה זו מציעה לנו את ThrowingPredicate בכיתה, שיש בה את לא בדוק() שיטה לעטוף חריגים מסומנים.

בואו נראה את זה בפעולה:

רשימת לקוחותWithValidProfilePhoto = לקוחות .stream () .filter (ThrowingPredicate.unchecked (לקוח :: hasValidProfilePhoto)) .collect (Collectors.toList ());

4. מסקנה

במאמר זה ראינו דוגמה כיצד להשתמש ב- לְסַנֵן() שיטה לעיבוד זרמים. בדקנו גם כמה חלופות לטיפול בחריגים.

כמו תמיד, הקוד השלם זמין ב- GitHub.


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