DistinctBy ב- Java Stream API

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

חיפוש אחר אלמנטים שונים ברשימה הוא אחת המשימות הנפוצות שעומדות בפנינו כמתכנתים בדרך כלל. מג'אווה 8 ואילך עם הכללת זרמים יש לנו API חדש לעיבוד נתונים באמצעות גישה פונקציונלית.

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

2. שימוש ב- API של Stream

ממשק ה- API של Stream מספק את ה- מוּבהָק() שיטה המחזירה אלמנטים שונים של רשימה על בסיס שווים() שיטת ה- לְהִתְנַגֵד מעמד.

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

2.1. שימוש במסנן סטטיסטי

אחד הפתרונות האפשריים יהיה יישום סטטוס לְבַסֵס:

ציבורי סטטי ציבורי distinctByKey (key key extractor) {Map seen = new ConcurrentHashMap (); החזר t -> seen.putIfAbsent (keyExtractor.apply (t), Boolean.TRUE) == null; }

כדי לבדוק זאת, נשתמש בהמשך אדם כיתה שיש לה את התכונות גיל, אימייל, ו שֵׁם:

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

ולקבל אוסף מסונן חדש מאת שֵׁם, אנו יכולים להשתמש ב:

רשימת personListFiltered = personList.stream () .filter (distinctByKey (p -> p.getName ())) .collect (Collectors.toList ());

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

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

3.1. משתמש ב ListIterate.distinct ()

ה ListIterate.distinct () השיטה מאפשרת לנו לסנן א זרם באמצעות שונות HashingStrategies. ניתן להגדיר אסטרטגיות אלה באמצעות ביטויים למבדה או הפניות לשיטה.

אם אנחנו רוצים לסנן לפי של האדם שֵׁם:

רשימה personListFiltered = ListIterate .distinct (personList, HashingStrategies.fromFunction (אדם :: getName));

לחלופין, אם התכונה בה אנו נשתמש היא פרימיטיבית (int, ארוכה, כפולה), אנו יכולים להשתמש בפונקציה מיוחדת כזו:

רשימת personListFiltered = ListIterate.distinct (personList, HashingStrategies.fromIntFunction (אדם :: getAge));

3.2. תלות של Maven

עלינו להוסיף את התלות הבאות שלנו pom.xml להשתמש באוספי Eclipse בפרויקט שלנו:

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

תוכלו למצוא את הגרסה האחרונה של ספריית אוספי האקליפס במאגר Maven Central.

למידע נוסף על ספרייה זו נוכל לעבור למאמר זה.

4. שימוש ב- Vavr (Javaslang)

זוהי ספרייה פונקציונלית עבור Java 8 המספקת נתונים בלתי ניתנים לשינוי ומבני בקרה פונקציונליים.

4.1. באמצעות List.distinctBy

כדי לסנן רשימות, מחלקה זו מספקת מחלקת רשימה משלה הכוללת את distinctBy () שיטה המאפשרת לנו לסנן לפי תכונות של האובייקטים שהוא מכיל:

רשימת personListFiltered = List.ofAll (personList) .distinctBy (Person :: getName) .toJavaList ();

4.2. תלות של Maven

נוסיף את התלות הבאות שלנו pom.xml להשתמש ב- Vavr בפרויקט שלנו.

 io.vavr vavr 0.9.0 

תוכל למצוא את הגרסה האחרונה של ספריית Vavr במאגר Maven Central.

למידע נוסף על ספרייה זו נוכל לעבור למאמר זה.

5. שימוש ב- StreamEx

ספרייה זו מספקת שיעורים ושיטות שימושיות לעיבוד זרמי Java 8.

5.1. באמצעות StreamEx.distinct

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

רשימת personListFiltered = StreamEx.of (personList) .distinct (Person :: getName) .toList ();

5.2. תלות של Maven

נוסיף את התלות הבאות שלנו pom.xml להשתמש ב- StreamEx בפרויקט שלנו.

 one.util streamex 0.6.5 

תוכל למצוא את הגרסה האחרונה של ספריית StreamEx במאגר Maven Central.

6. מסקנה

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

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


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