Java - שלב אוספים מרובים

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

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

נבדוק חמש גישות שונות - שתיים המשתמשות ב- Java 8, אחת באמצעות Guava, אחת המשתמשת באוספי Apache Commons, ואחת המשתמשת רק ב- Java 7 SDK הסטנדרטי.

בדוגמאות הבאות נבחן את האוספים הבאים:

אוסף אוסף A = Arrays.asList ("S", "T"); אוסף האוסף B = Arrays.asList ("U", "V");

2. שימוש ב- Java 8 זרם ממשק API

ה זרם ממשק ב- Java API מספק שיטות שימושיות המקלות על עיבוד אוספים. בואו נסתכל על שתיים משיטותיה - concat () ו flatMap () - המשמשים לשילוב אוספים.

ברגע שאתה מקבל א זרם, אתה יכול לבצע פעולות מצטברות בו.

2.1. משתמש ב concat () שיטה

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

בדוגמה שלהלן, בואו נשלב אוסף A. ו אוסף B. משתמש ב concat () שיטה:

זרם combinedStream = Stream.concat (collectionA.stream (), collectionB.stream ());

אם אתה צריך לשלב יותר משניים זרמיםאתה יכול להפעיל את concat () שיטה שוב מתוך הקריאה המקורית:

זרם combinedStream = Stream.concat (Stream.concat (collectionA.stream (), collectionB.stream ()), collectionC.stream ());

חשוב לציין שג'אווה 8 זרמים אינם ניתנים לשימוש חוזר, לכן עליכם לקחת זאת בחשבון כאשר אתם מקצים אותם למשתנים.

2.2. משתמש ב flatMap () שיטה

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

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

זרם combinedStream = Stream.of (collectionA, collectionB) .flatMap (אוסף :: stream); אוסף collectionCombined = combinedStream.collect (Collectors.toList ());

3. שימוש בגויאבה

ספריית גויאבה של גוגל מספקת מספר שיטות נוחות להפעלה באוספים וניתן להשתמש בהן עם Java 6 ואילך.

3.1. משתמש ב Iterables.concat () שיטה

ה Iterables.concat () שיטה היא אחת השיטות הנוחות של גויאבה המשמשות למיזוג אוספים:

Iterable combinedIterables = Iterables.unmodifiableIterable (Iterables.concat (collectionA, collectionA));

ה ניתן לנידון ניתן להמיר לאוסף:

אוסף collectionCombined = Lists.newArrayList (combinedIterables);

3.2. תלות של Maven

הוסף את התלות הבאה ל- Maven שלך pom.xml קובץ כדי לכלול את ספריית גויאבה בפרויקט שלך:

 com.google.guava גויאבה 20.0 

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

4. שימוש באוספי Apache Commons

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

4.1. משתמש ב IterableUtils.chainedIterable () שיטה

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

Iterable combinedIterables = IterableUtils.chainedIterable (collectionA, collectionB);

4.2. משתמש ב CollectionUtils.union () שיטה

שיטות שירות ומעצבים עבור אוסף המקרים מסופקים על ידי אוסף כלי עזר מעמד. ה הִתאַחֲדוּת() שיטה מהמחלקה הזו מחזירה א אוסף המכיל את האיחוד של הנתון ניתן לנידון מקרים.

Iterable combinedIterables = CollectionUtils.union (collectionA, collectionB);

במקרה של הִתאַחֲדוּת() השיטה, הקרדינליות של כל אלמנט באוסף המוחזר תהיה שווה למקסימום הקרדינליות של אותו אלמנט בשני הנתונים שרטוטים. המשמעות היא שהאוסף המשולב מורכב רק מהאלמנטים באוסף הראשון ומהאלמנטים באוסף השני שלא היו נוכחים באחד הראשון.

4.3. תלות של Maven

הוסף את התלות הבאה ל- Maven שלך pom.xml הקובץ כדי לכלול את ספריית אוספי Apache Commons בפרויקט שלך:

 org.apache.commons commons-collection4 4.1 

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

5. שימוש ב- Java 7

אם אתה עדיין משתמש בג'אווה 7 ורוצה להימנע מספריות של צד שלישי כגון גויאבה, תוכל להשתמש ב - הוסף הכל() שיטה לשילוב אלמנטים ממספר אוספים, או שתוכל לכתוב שיטות עזר משלך לשילוב שרטוטים.

5.1. משתמש ב הוסף הכל() שיטה

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

רשימת רשימה C = ArrayList חדש (); listC.addAll (listA); listC.addAll (listB);

5.2. כתיבה בהתאמה אישית concat () שיטה

הדוגמה הבאה מגדירה א concat () שיטה שמקבלת שתיים שרטוטים ומחזיר מיזוג ניתן לנידון לְהִתְנַגֵד:

concat Iterable concat (Iterable i1, Iterable i2) {return new Iterable () {איטרטור ציבורי איטרטור () {להחזיר איטרטור חדש () {Iterator listIterator = i1.iterator (); בוליאני בדק HasNext; E nextValue; התחלה בוליאנית פרטיתTheSecond; בטל אתNext () {if (listIterator.hasNext ()) {checkedHasNext = true; nextValue = listIterator.next (); } אחר אם (startTheSecond) בדק HasNext = false; אחרת {startTheSecond = נכון; listIterator = i2.iterator (); הבא(); }} בוליאני ציבורי hasNext () {if (checkedHasNext == null) theNext (); החזרה נבדקהHasNext; } ציבורי E הבא () {אם (! hasNext ()) לזרוק NoSuchElementException חדש (); checkedHasNext = null; חזור nextValue; } בטל ציבורי להסיר () {listIterator.remove (); }}; }}; }

ה concat () ניתן להפעיל את השיטה על ידי העברת שני האוספים כטיעוניה:

Iterable combinedIterables = concat (collectionA, collectionB); אוסף אוסף Combined = makeListFromIterable (combinedIterables);

אם אתה צריך את ניתן לנידון להיות זמין כ- רשימה, אתה יכול גם להשתמש ב- makeListFromIterable () שיטה היוצרת א רשימה באמצעות חברי הלהקה ניתן לנידון:

רשימה סטטית ציבורית makeListFromIterable (Iterable iter) {List list = new ArrayList (); עבור (פריט E: iter) {list.add (פריט); } רשימת החזרה; }

6. מסקנה

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

הקוד עבור הדרכה זו זמין באתר Github.