כיצד להמיר רשימה למפה בג'אווה

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

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

אנו נניח שכל אלמנט של ה- רשימה יש מזהה שישמש כמפתח בתוצאה מַפָּה.

2. מבנה נתונים לדוגמא

ראשית, בואו לדגם את האלמנט:

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

ה תְעוּדַת זֶהוּת השדה הוא ייחודי, ולכן אנו יכולים להפוך אותו למפתח.

נתחיל להמיר בדרך המסורתית.

3. לפני Java 8

ברור שאנחנו יכולים להמיר א רשימה אל א מַפָּה באמצעות שיטות ליבה של Java:

מפה ציבורית convertListBeforeJava8 (רשימת רשימה) {מפה מפה = HashMap חדש (); עבור (חיה של בעלי חיים: רשימה) {map.put (animal.getId (), חיה); } מפה חזרה; }

בואו לבדוק את ההמרה:

@ מבחן ציבורי בטל כאשר ConvertBeforeJava8_thenReturnMapWithTheSameElements () {Map map = convertListService .convertListBeforeJava8 (רשימה); assertThat (map.values ​​(), containInAnyOrder (list.toArray ())); }

4. עם Java 8

החל מג'אווה 8 נוכל להמיר רשימה לתוך מַפָּה באמצעות זרמים ו אספנים:

 מפה ציבורית convertListAfterJava8 (רשימת רשימה) {Map map = list.stream () .collect (Collectors.toMap (Animal :: getId, animal -> animal)); מפת חזרה; }

שוב, בואו נוודא שההמרה מתבצעת כהלכה:

@Test ציבורי בטל כאשרConvertAfterJava8_thenReturnMapWithTheSameElements () {Map map = convertListService.convertListAfterJava8 (רשימה); assertThat (map.values ​​(), containInAnyOrder (list.toArray ())); }

5. שימוש בספריית גויאבה

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

5.1. תצורת Maven

ראשית, עלינו להוסיף את התלות הבאה שלנו pom.xml:

 com.google.guava גויאבה 23.6.1-jre 

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

5.2. המרה עם Maps.uniqueIndex ()

שנית, בואו נשתמש Maps.uniqueIndex () שיטה להמיר רשימה לתוך מַפָּה:

מפה ציבורית convertListWithGuava (רשימת רשימה) {מפה מפה = מפות .uniqueIndex (רשימה, חיה :: getId); מפת חזרה; }

לבסוף, בואו נבדוק את ההמרה:

@ מבחן ציבורי בטל כאשר ConvertWithGuava_thenReturnMapWithTheSameElements () {Map map = convertListService .convertListWithGuava (רשימה); assertThat (map.values ​​(), containInAnyOrder (list.toArray ())); } 

6. שימוש בספריית Apache Commons

אנחנו יכולים לעשות המרה גם עם ה-שיטת ספריית Apache Commons.

6.1. תצורת Maven

ראשית, בואו נכלול תלות של Maven:

 org.apache.commons commons-collection4 4.2 

הגרסה האחרונה של תלות זו זמינה כאן.

6.2. MapUtils

שנית, נבצע את ההמרה באמצעות MapUtils.populateMap ():

מפה ציבורית convertListWithApacheCommons2 (רשימת רשימות) {מפת מפה = HashMap חדש (); MapUtils.populateMap (מפה, רשימה, בעלי חיים :: getId); מפת חזרה; }

לבסוף, בואו נוודא שזה עובד כצפוי:

@Test ציבורי בטל כאשר ConvertWithApacheCommons2_thenReturnMapWithTheSameElements () {Map map = convertListService .convertListWithApacheCommons2 (רשימה); assertThat (map.values ​​(), containInAnyOrder (list.toArray ())); }

7. התנגשות ערכים

בואו לבדוק מה יקרה אם תְעוּדַת זֶהוּת שדה אינו ייחודי.

7.1. רשימה שֶׁל בעלי חיים עם שכפול תְעוּדַת זֶהוּתס

ראשית, בואו ליצור רשימה שֶׁל בעל חייםs עם לא ייחודי תְעוּדַת זֶהוּתs:

@ לפני init בטל פומבי () {this.duplicatedIdList = ArrayList חדש (); חתול בעלי חיים = בעל חיים חדש (1, "חתול"); duplicatedIdList.add (חתול); כלב בעלי חיים = בעל חיים חדש (2, "כלב"); duplicatedIdList.add (כלב); חזיר בעלי חיים = בעל חיים חדש (3, "חזיר"); duplicatedIdList.add (חזיר); פרה מהחי = חיה חדשה (4, "פרה"); duplicatedIdList.add (פרה); עז בעלי חיים = בעל חיים חדש (4, "עז"); duplicatedIdList.add (עז); }

כפי שמוצג לעיל, פָּרָה וה עֵז יש אותו דבר תְעוּדַת זֶהוּת.

7.2. בדיקת ההתנהגות

ג'אווה מַפָּהשל לָשִׂים() השיטה מיושמת כך שהערך המוסף האחרון יחליף את הקוד הקודם באותו מפתח.

מסיבה זו, ההמרה המסורתית ו- Apache Commons MapUtils.populateMap () מתנהגים באותו אופן:

@Test הציבור בטל כאשר ConvertBeforeJava8_thenReturnMapWithRewrittenElement () {Map map = convertListService .convertListBeforeJava8 (duplicatedIdList); assertThat (map.values ​​(), hasSize (4)); assertThat (map.values ​​(), hasItem (duplicatedIdList.get (4))); } @ מבחן ציבורי בטל כאשר ConvertWithApacheCommons_thenReturnMapWithRewrittenElement () {Map map = convertListService .convertListWithApacheCommons (duplicatedIdList); assertThat (map.values ​​(), hasSize (4)); assertThat (map.values ​​(), hasItem (duplicatedIdList.get (4))); }

כפי שניתן לראות, עֵז מחליף את פָּרָה עם אותו הדבר תְעוּדַת זֶהוּת.

שלא כמו זה, Collectors.toMap () ו MapUtils.populateMap () לזרוק IllegalStateException ו IllegalArgumentException בהתאמה:

@Test (צפוי = IllegalStateException.class) חלל ציבורי נתון ADupIdList_whenConvertAfterJava8_thenException () {convertListService.convertListAfterJava8 (duplicatedIdList); } @Test (צפוי = IllegalArgumentException.class) חלל ציבורי שניתן ADupIdList_whenConvertWithGuava_thenException () {convertListService.convertListWithGuava (duplicatedIdList); }

8. מסקנה

במאמר מהיר זה סקרנו דרכים שונות להמרת א רשימה אל א מַפָּה, מתן דוגמאות עם Java הליבה וכן כמה ספריות פופולריות של צד שלישי.

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


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