כיצד לסנן אוסף בג'אווה

1. סקירה כללית

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

זוהי משימה בסיסית שקיימת כמעט בכל יישום Java.

מסיבה זו, מספר הספריות המספק פונקציונליות למטרה זו הוא משמעותי.

במיוחד במדריך זה נסקור:

  • Java 8 Streams ' לְסַנֵן() פוּנקצִיָה
  • ג'אווה 9 סִנוּן אַסְפָן
  • רלוונטי אוספי ליקוי חמה ממשקי API
  • של אפאצ'י פילטר אוסף כלים () שיטה
  • של גויאבה מסנן אוספים 2 () גִישָׁה

2. שימוש בזרמים

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

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

2.1. סינון אוסף עם זרמים

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

לפיכך, אנו יכולים לבטא את התנאי בו נשתמש כדי להעריך כל פריט כ- 'ערך% 2 == 0‘.

בכל המקרים נצטרך להגדיר מצב זה כ- לְבַסֵס לְהִתְנַגֵד:

אוסף ציבורי findEvenNumbers (אוסף baseCollection) {Predicate streamsPredicate = item -> item% 2 == 0; להחזיר baseCollection.stream () .filter (streamsPredicate) .collect (Collectors.toList ()); }

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

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

2.2. סינון לאחר קיבוץ אוסף ב- Java 9

זרמים מאפשרים לנו לצבור פריטים באמצעות קיבוץ לפי אספן.

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

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

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

מפה ציבורית findEvenNumbersAfterGrouping (אוסף baseCollection) {פונקציה getQuantityOfDigits = פריט -> (int) Math.log10 (פריט) + 1; return baseCollection.stream () .collect (groupingBy (getQuantityOfDigits, סינון (פריט -> פריט% 2 == 0, toList ()))); }

בקיצור, אם נשתמש באספן זה, אנו עשויים בסופו של דבר להזין ערך ריק, ואילו אם נסנן לפני הקיבוץ, האספן בכלל לא היה יוצר ערך כזה.

כמובן, היינו בוחרים את הגישה על פי הדרישות שלנו.

3. שימוש אוספי ליקוי חמה

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

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

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

3.1. תלות

נתחיל בהוספת התלות הבאה לפרויקטים שלנו pom.xml:

 org.eclipse.collections ליקויי ליקוי 9.2.0 

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

3.2. סינון אוסף עם אוספי ליקוי חמה

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

אוסף ציבורי findEvenNumbers (BaseCollection Collection) {Predicate eclipsePredicate = item -> item% 2 == 0; אוסף filteredList = Lists.mutable .ofAll (baseCollection) .select (eclipsePredicate); החזר filteredList; }

כחלופה היינו יכולים להשתמש ב- לְחַזֵרשל בחר()שיטה סטטית להגדרת filteredList לְהִתְנַגֵד:

אוסף filteredList = Iterate.select (baseCollection, eclipsePredicate);

4. שימוש באפצ'י אוסף כלי עזר

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

במדריך זה, עם זאת, אנו נתמקד בה לְסַנֵן() יישום.

4.1. תלות

ראשית, נצטרך את התלות הבאות שלנו pom.xml קוֹבֶץ:

 org.apache.commons commons-collection4 4.2 

4.2. סינון אוסף עם אוסף כלי עזר

כעת אנו מוכנים להשתמש ב- CollectonUtils' שיטות:

אוסף ציבורי findEvenNumbers (BaseCollection Collection) {Predicate apachePredicate = item -> item% 2 == 0; CollectionUtils.filter (baseCollection, apachePredicate); base baseCollection; }

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

זה אומר ש אוסף הבסיס צריך להיות משתנה, אחרת הוא יוציא חריג.

5. שימוש בגויאבה אוספים 2

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

5.1. תלות

נתחיל בהוספה של תלות זו pom.xml קוֹבֶץ:

 com.google.guava גויאבה 25.1-jre 

5.2. סינון אוסף עם אוספים 2

כפי שאנו רואים, גישה זו דומה למדי לזו שבוצעה בחלק האחרון:

אוסף ציבורי findEvenNumbers (אוסף baseCollection) {Predicate guavaPredicate = item -> item% 2 == 0; להחזיר Collections2.filter (baseCollection, guavaPredicate); }

שוב, כאן אנו מגדירים ספציפי לגויאבה לְבַסֵס לְהִתְנַגֵד.

במקרה זה, גויאבה אינה משנה את ה- baseCollection, זה מייצר חדש, כך שנוכל להשתמש באוסף בלתי משתנה כקלט.

6. מסקנה

לסיכום, ראינו שישנן דרכים רבות ושונות לסינון אוספים בג'אווה.

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

במיוחד אם עלינו לתמוך בגרסאות Java ישנות יותר. עם זאת, אם זה המקרה, עלינו לזכור את תכונות הג'אווה האחרונות ששימשו במהלך ההדרכה, כגון lambdas, יש להחליף בשיעורים אנונימיים.

כרגיל, אנו יכולים למצוא את כל הדוגמאות המוצגות במדריך זה ברפיו של Github.