המרת אוסף ל- ArrayList בג'אווה
1. סקירה כללית
המרת אוספי Java מסוג אחד למשנהו היא משימת תכנות נפוצה. במדריך זה נמיר כל סוג של אוסף ל רשימת מערך.
במהלך כל ההדרכה, נניח שכבר יש לנו אוסף של פו חפצים. משם ניצור רשימת מערך תוך שימוש בגישות שונות.
2. הגדרת הדוגמה שלנו
אבל לפני שנמשיך, בואו לדגם את הקלט והפלט שלנו.
המקור שלנו יכול להיות כל סוג של אוסף ולכן נכריז עליו באמצעות ה- אוסף מִמְשָׁק:
אוסף srcCollection;
אנחנו צריכים לייצר רשימת מערך עם אותו סוג אלמנט:
ArrayList newList;
3. שימוש בבנאי ArrayList
הדרך הפשוטה ביותר להעתיק אוסף לאוסף חדש היא באמצעות הבנאי שלו.
במדריך הקודם שלנו ל- ArrayList, למדנו שה- רשימת מערך בונה יכול לקבל פרמטר אוסף:
ArrayList newList = ArrayList חדש (srcCollection);
- החדש רשימת מערך מכיל עותק רדוד של רכיבי Foo באוסף המקורות.
- הסדר זהה לזה שבאוסף המקור.
הפשטות של הבנאי הופכת אותו לאופציה נהדרת ברוב התרחישים.
4. שימוש ב- API של Streams
עַכשָׁיו, בואו ננצל את ה- Streams API כדי ליצור ArrayList מאוסף קיים: בקטע זה: אם לא היינו מודאגים מהמדויק רשימה סוג, נוכל לפשט: ציין זאת toCollection () ו למנות() מיובאים סטטית מ אספנים. למידע נוסף, עיין במדריך שלנו בנושא אספני Java 8. לפני שהזכרנו "עותקים רדודים". בכך אנו מתכוונים לכך האלמנטים ברשימה החדשה זהים לחלוטין פו מקרים שעדיין קיימים באוסף המקורות. לכן העתקנו את פוs אל רשימה חדשה בהפניה. אם נשנה את התוכן של א פו למשל באחד מהאוספים השינוי יבוא לידי ביטוי בשני האוספים. לפיכך, אם אנו רוצים לשנות את האלמנטים באחת מהאוספים לְלֹא כדי לשנות את השני עלינו לבצע "עותק עמוק". להעתקה עמוקה א פו, אנחנו ליצור חדש לגמרי פו מופע עבור כל אלמנט. כתוצאה מכך, כל ה פו יש להעתיק שדות למופעים החדשים. בואו נגדיר את שלנו פו בכיתה כדי שתדע להעתיק את עצמה: כאן אנו יכולים לראות את השדות תְעוּדַת זֶהוּת ו שֵׁם הם int ו חוּט. סוגי נתונים אלה מועתקים לפי ערך. לפיכך, אנו יכולים פשוט להקצות את שניהם. ה הוֹרֶה שדה הוא אחר פו, שהוא כיתה. אם פו הושתל, כל קוד שמשתף את ההפניה יושפע מהשינויים האלה. עלינו להעתיק את ה- הוֹרֶה שדה. עכשיו נוכל לחזור לשלנו רשימת מערך הֲמָרָה. אנחנו פשוט צריכים את מַפָּה מפעיל כדי להכניס את העותק העמוק לתוך הזרימה: אנו יכולים לשנות את תוכן האוסף מבלי להשפיע על האחר. העתקה עמוקה יכולה להיות תהליך ממושך בהתאם למספר האלמנטים ולעומק הנתונים. שימוש בזרם מקביל כאן עשוי לספק שיפור ביצועים במידת הצורך. כברירת מחדל, הזרם שלנו יעביר אלמנטים שלנו רשימת מערך באותו סדר כפי שהם נתקלים באוסף המקורות. אם אנחנו רוצים לשנות את הסדר הזה נוכל ליישם את מְמוּיָן() מפעיל לזרם. למיין את שלנו פו חפצים לפי שם: אנו יכולים למצוא פרטים נוספים על הזמנת זרמים במדריך קודם זה. ה רשימת מערך constructor היא דרך יעילה להשיג את התוכן של a אוסף לתוך חדש רשימת מערך. עם זאת, אם עלינו לשנות את הרשימה המתקבלת, ממשק ה- API של Streams מספק דרך חזקה לשנות את התהליך. הקוד המשמש במאמר זה ניתן למצוא בשלמותו באתר GitHub.ArrayList newList = srcCollection.stream (). Collect (toCollection (ArrayList :: new));
רשימת newList = srcCollection.stream (). Collect (toList ());
5. העתק עמוק
מחלקה ציבורית 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); }}
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. מסקנה