שילוב של סוגי אוספים שונים בג'אווה

1. הקדמה

במדריך מהיר זה נחקור דרכים שונות לשילוב אוספים ב- Java.

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

2. ספריות חיצוניות לעבודה עם אוספים

לצד גישות מקומיות, נשתמש גם בספריות חיצוניות. אנא הוסף את התלות הבאות ב- pom.xml:

 org.apache.commons commons-collection4 4.2 org.apache.commons commons-exec 1.3 com.google.guava גויאבה 26.0-jre 

ניתן למצוא את הגרסאות האחרונות ב- Maven Central עבור Commons, Commons-exec ו- Guava.

3. שילוב מערכים בג'אווה

3.1. פתרון Java מקורי

Java מגיע עם מובנה arraycopy בטל () שיטה שמעתיקה מערך מקור נתון ליעד אחד.

אנו יכולים להשתמש בו באופן הבא:

אובייקט [] משולב = אובייקט חדש [first.length + second.length]; System.arraycopy (ראשון, 0, משולב, 0, ראשון.אורך); System.arraycopy (שני, 0, משולב, ראשון.אורך, שני.אורך);

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

זהו פתרון Java מקורי, ולכן אין צורך בספריות חיצוניות.

3.2. באמצעות Java 8 זרם ממשק API

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

לשילוב מערכים באמצעות א זרםאנו יכולים להשתמש בקוד זה:

אובייקט [] משולב = Stream.concat (Arrays.stream (ראשון), Arrays.stream (שני)). ToArray ();

Stream.concat () יוצר זרם משורשר בו אלמנטים של הזרם הראשון ואחריו אלמנטים של הזרם השני, אשר לאחר מכן מומר למערך באמצעות toArray () שיטה.

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

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

3.3. באמצעות ArrayUtils מאפצ'י קומונס

ספריית Apache commons מספקת לנו את ה- הוסף הכל() שיטה מה- ArrayUtils חֲבִילָה. אנו יכולים לספק מערך יעד ומקור כפרמטרים, ושיטה זו תחזיר מערך משולב:

אובייקט [] משולב = ArrayUtils.addAll (ראשון, שני);

שיטה זו נדונה גם בפרטים במאמר Array Processing with Apache Commons Lang 3.

3.4. באמצעות גויאבה

גויאבה מספקת לנו את concat () שיטה לאותה מטרה:

אובייקט [] משולב = ObjectArrays.concat (ראשון, שני, Object.class);

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

4. שילוב רשימה בג'אווה

4.1. באמצעות אוסף יָלִיד הוסף הכל() שיטה

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

רשימה משולבת = ArrayList חדש (); combined.addAll (ראשון); combined.addAll (שני);

מכיוון ששיטה זו מסופקת בממשק ההורה ביותר של מסגרת האוספים, כלומר, אוסף ממשק, זה יכול להיות מיושם בכל רשימהs ו- מַעֲרֶכֶתס.

4.2. באמצעות Java 8

אנחנו יכולים להשתמש זרם ו אספנים בצורה הבאה לשלב רשימות:

רשימה משולבת = Stream.concat (first.stream (), second.stream ()). Collect (Collectors.toList ());

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

אנחנו יכולים גם להשתמש flatMaps בדרך זו:

רשימה משולבת = Stream.of (הראשון, השני) .flatMap (אוסף :: stream) .collect (Collectors.toList ());

ראשית, אנו משתמשים זרם של() שמחזיר זרם רציף של שתי רשימות - ראשון ו שְׁנִיָה. לאחר מכן נעביר את זה ל flatMap שיחזיר את תוכן הזרם הממופה לאחר החלת פונקציית המיפוי. שיטה זו נדונה גם במאגר מיזוג זרמים במערכת Java.

למידע נוסף על flatMap, עבור למאמר זה של Baeldung.

4.3. באמצעות ListUtils מאפצ'י קומונס

CollectionUtils.union עושה איחוד של שני אוספים ומחזיר אוסף המכיל את כל האלמנטים:

רשימה משולבת = ListUtils.union (ראשון, שני);

שיטה זו נדונה גם במדריך לאוספי Apache Commons אוסף כלי עזר. למידע נוסף, עבור לסעיף 4.9. של מאמר זה.

4.4. באמצעות גויאבה

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

Iterable combinedIterables = Iterables .unmodifiableIterable (Iterables.concat (ראשון, שני)); רשימה משולבת = Lists.newArrayList (combinedIterables);

5. שילוב מַעֲרֶכֶת בג'אווה

5.1. פתרון Java רגיל

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

הגדר משולב = HashSet חדש (); combined.addAll (ראשון); combined.addAll (שני);

5.2. שימוש ב- Java 8 Streams

אותה פונקציה בה השתמשנו רשימה ניתן ליישם אובייקטים כאן:

הגדר משולב = Stream .concat (first.stream (), second.stream ()) .collect (Collectors.toSet ());

ההבדל הבולט היחיד כאן בהשוואה לרשימה הוא שבמקום להשתמש Collectors.toList (), אנחנו משתמשים Collectors.toSet () לאגור את כל האלמנטים משני הזרמים המסופקים לחדש מַעֲרֶכֶת.

ודומה ל רשימות, כשמשתמש flatMaps עַל סטיםזה ייראה כמו:

הגדר משולב = Stream.of (הראשון, השני) .flatMap (אוסף :: stream) .collect (Collectors.toSet ());

5.3. באמצעות Apache Commons

דומה ל ListUtils, אנחנו יכולים גם לעבוד עם SetUtils זה עושה איחוד של מַעֲרֶכֶת אלמנטים:

סט משולב = SetUtils.union (ראשון, שני);

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

ספריית גויאבה מספקת לנו פשוט Sets.union () שיטה לשלב סטים בג'אווה:

קבוצה משולבת = Sets.union (ראשון, שני);

6. שילוב מַפָּה בג'אווה

6.1. פתרון Java רגיל

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

מפה משולבת = HashMap חדש (); combined.putAll (ראשון); combined.putAll (שני);

6.2. באמצעות Java 8

מאז Java 8, ה- מַפָּה הכיתה מורכבת מ לְמַזֵג() שיטה המקבלת מפתח, ערך ו- BiFunction. אנו יכולים להשתמש בזה עם הצהרת Java 8 forEach כדי להשיג פונקציונליות מיזוג:

second.forEach ((key, value) -> first.merge (key, value, String :: concat));

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

אנחנו יכולים גם להשתמש flatMap ככה:

מפה משולבת = Stream.of (הראשון, השני) .map (Map :: entrySet) .flatMap (אוסף :: stream) .collect (Collectors.toMap (Map.Entry :: getKey, Map.Entry :: getValue, String: : concat));

6.3. שימוש ב- Apache Commons Exec

Apache Commons Exec מספק לנו פשוט מיזוג (מפה ראשונה, מפה שנייה) שיטה:

מפה משולבת = MapUtils.merge (ראשון, שני);

6.4. שימוש בגוגל גויאבה

אנחנו יכולים להשתמש ImmutableMap מסופק על ידי ספריית גויאבה של גוגל. שֶׁלָה putAll () השיטה משייכת את כל המפתחות והערכים של המפה הנתונה למפה הבנויה:

מפה משולבת = ImmutableMap.builder () .putAll (ראשון) .putAll (שני) .build ();

7. מסקנה

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

כמו תמיד, ניתן למצוא את קטעי הקוד המלאים עם בדיקות היחידה הנכונות שלהם ב- GitHub.


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