המרת אוסף ל- ArrayList בג'אווה

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

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

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

2. הגדרת הדוגמה שלנו

אבל לפני שנמשיך, בואו לדגם את הקלט והפלט שלנו.

המקור שלנו יכול להיות כל סוג של אוסף ולכן נכריז עליו באמצעות ה- אוסף מִמְשָׁק:

אוסף srcCollection; 

אנחנו צריכים לייצר רשימת מערך עם אותו סוג אלמנט:

ArrayList newList;

3. שימוש בבנאי ArrayList

הדרך הפשוטה ביותר להעתיק אוסף לאוסף חדש היא באמצעות הבנאי שלו.

במדריך הקודם שלנו ל- ArrayList, למדנו שה- רשימת מערך בונה יכול לקבל פרמטר אוסף:

ArrayList newList = ArrayList חדש (srcCollection);
  • החדש רשימת מערך מכיל עותק רדוד של רכיבי Foo באוסף המקורות.
  • הסדר זהה לזה שבאוסף המקור.

הפשטות של הבנאי הופכת אותו לאופציה נהדרת ברוב התרחישים.

4. שימוש ב- API של Streams

עַכשָׁיו, בואו ננצל את ה- Streams API כדי ליצור ArrayList מאוסף קיים:

ArrayList newList = srcCollection.stream (). Collect (toCollection (ArrayList :: new));

בקטע זה:

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

אם לא היינו מודאגים מהמדויק רשימה סוג, נוכל לפשט:

רשימת newList = srcCollection.stream (). Collect (toList ());

ציין זאת toCollection () ו למנות() מיובאים סטטית מ אספנים. למידע נוסף, עיין במדריך שלנו בנושא אספני Java 8.

5. העתק עמוק

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

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

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

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

מחלקה ציבורית Foo {מזהה פרטי פרטי; שם מחרוזת פרטי; הורה Foo פרטי; Foo ציבורי (מזהה int, שם מחרוזת, הורה Foo) {this.id = id; this.name = שם; this.parent = הורה; } Foo deepCopy ציבורי () {להחזיר Foo חדש (this.id, this.name, this.parent! = null? this.parent.deepCopy (): null); }}

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

ה הוֹרֶה שדה הוא אחר פו, שהוא כיתה. אם פו הושתל, כל קוד שמשתף את ההפניה יושפע מהשינויים האלה. עלינו להעתיק את ה- הוֹרֶה שדה.

עכשיו נוכל לחזור לשלנו רשימת מערך הֲמָרָה. אנחנו פשוט צריכים את מַפָּה מפעיל כדי להכניס את העותק העמוק לתוך הזרימה:

ArrayList newList = srcCollection.stream () .map (foo -> foo.deepCopy ()) .collect (toCollection (ArrayList :: new));

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

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

6. שליטה בסדר הרשימה

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

אם אנחנו רוצים לשנות את הסדר הזה נוכל ליישם את מְמוּיָן() מפעיל לזרם. למיין את שלנו פו חפצים לפי שם:

ArrayList newList = srcCollection.stream () .sorted (Comparator.comparing (Foo :: getName)) .collect (toCollection (ArrayList :: new));

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

7. מסקנה

ה רשימת מערך constructor היא דרך יעילה להשיג את התוכן של a אוסף לתוך חדש רשימת מערך.

עם זאת, אם עלינו לשנות את הרשימה המתקבלת, ממשק ה- API של Streams מספק דרך חזקה לשנות את התהליך.

הקוד המשמש במאמר זה ניתן למצוא בשלמותו באתר GitHub.


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