Apache Commons אוספים MapUtils

מאמר זה הוא חלק מסדרה: • תיק אוספים של Apache Commons

• אוספי Apache Commons SetUtils

• אוספי Apache Commons OrderedMap

• אוספי Apache Commons BidiMap

• מדריך לאוסף אוספי Apons Commons CollectionUtils

• אוספי Apache Commons MapUtils (מאמר נוכחי) • מדריך Apache Commons CircularFifoQueue

1. הקדמה

MapUtils הוא אחד הכלים הזמינים בפרויקט Apache Commons Collections.

במילים פשוטות, הוא מספק שיטות שימוש ומעצבים לעבודה java.util.Map ו java.util.SortedMap מקרים.

2. התקנה

נתחיל בהוספת התלות:

 org.apache.commons commons-collection4 4.1 

3. שיטות שירות

3.1. ליצור מַפָּה מ- מַעֲרָך

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

מחלקה ציבורית MapUtilsTest {מחרוזת פרטית [] [] color2DArray = מחרוזת חדשה [] [] {{"אדום", "# FF0000"}, {"ירוק", "# 00FF00"}, {"כחול", "# 0000FF" }}; מחרוזת פרטית [] color1DArray = מחרוזת חדשה [] {"אדום", "# FF0000", "ירוק", "# 00FF00", "כחול", "# 0000FF"}; מפה מפת צבעונית פרטית; // ...}

בואו נראה כיצד נוכל ליצור מפה ממערך דו מימדי:

@ מבחן ציבורי בטל כאשרCreateMapFrom2DArray_theMapIsCreated () {this.colorMap = MapUtils.putAll (HashMap חדש (), this.color2DArray); assertThat (this.colorMap, הוא (aMapWithSize (this.color2DArray.length))); assertThat (this.colorMap, hasEntry ("RED", "# FF0000")); assertThat (this.colorMap, hasEntry ("ירוק", "# 00FF00")); assertThat (this.colorMap, hasEntry ("BLUE", "# 0000FF")); }

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

@Test הציבור בטל כאשרCreateMapFrom1DArray_theMapIsCreated () {this.colorMap = MapUtils.putAll (HashMap חדש (), this.color1DArray); assertThat (this.colorMap, הוא (aMapWithSize (this.color1DArray.length / 2))); assertThat (this.colorMap, hasEntry ("RED", "# FF0000")); assertThat (this.colorMap, hasEntry ("ירוק", "# 00FF00")); assertThat (this.colorMap, hasEntry ("BLUE", "# 0000FF")); }

3.2. הדפסת תוכן של א מַפָּה

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

@Test הציבור בטל כאשרVerbosePrintMap_thenMustPrintFormattedMap () {MapUtils.verbosePrint (System.out, "תווית אופציונלית", this.colorMap); }

והתוצאה:

תווית אופציונלית = {RED = # FF0000 BLUE = # 0000FF GREEN = # 00FF00}

אנחנו יכולים גם להשתמש debugPrint () אשר מדפיס בנוסף את סוגי הנתונים של הערכים.

3.3. השגת ערכים

MapUtils מספק כמה שיטות להפקת ערך ממפה עבור מפתח נתון ב- ריק-אופן בטוח.

לדוגמה, getString () מקבל חוּט מ ה מַפָּה. ה חוּט ערך מתקבל באמצעות toString (). אנו יכולים לציין את ערך ברירת המחדל שיוחזר אם הערך הוא ריק או אם ההמרה נכשלת:

@ מבחן ציבורי בטל כאשר GetKeyNotPresent_thenMustReturnDefaultValue () {String defaultColorStr = "COLOR_NOT_FOUND"; צבע מחרוזת = MapUtils .getString (this.colorMap, "BLACK", defaultColorStr); assertEquals (צבע, defaultColorStr); }

שים לב ששיטות אלה הן ריקבטוחים כלומר הם יכולים להתמודד בבטחה עם ריק פרמטר מפה:

@Test ציבורי בטל כאשרGetOnNullMap_thenMustReturnDefaultValue () {String defaultColorStr = "COLOR_NOT_FOUND"; צבע מחרוזת = MapUtils.getString (null, "RED", defaultColorStr); assertEquals (צבע, defaultColorStr); }

הנה ה צֶבַע יקבל את הערך כ COLOR_NOT_FOUND למרות שהמפה כן ריק.

3.4. הפוך את מַפָּה

אנו יכולים גם להפוך מפה בקלות:

@ מבחן ציבורי בטל כאשרInvertMap_thenMustReturnInvertedMap () {Map invColorMap = MapUtils.invertMap (this.colorMap); גודל int = invColorMap.size (); Assertions.assertThat (invColorMap) .hasSameSizeAs (colorMap) .containsKeys (this.colorMap.values ​​(). ToArray (מחרוזת חדשה [] {})) .containsValues ​​(this.colorMap.keySet (). ToArray (מחרוזת חדשה [] { })); }

זה יהפוך את colorMap ל:

{# 00FF00 = ירוק # FF0000 = אדום # 0000FF = כחול}

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

3.5. צ'קים אפסים וריקים

זה ריק() השיטה מחזירה נָכוֹן אם מַפָּה הוא ריק או ריק.

safeAddToMap () שיטה מונעת הוספה של אלמנטים nullיים ל- a מַפָּה.

4. מעצבים

שיטות אלה מוסיפות פונקציונליות נוספת ל- מַפָּה.

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

4.1. מידה קבועה מַפָּה

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

@Test (צפוי = IllegalArgumentException.class) ריק ברבים כאשרCreateFixedSizedMapAndAdd_thenMustThrowException () {Map rgbMap = MapUtils .fixedSizeMap (MapUtils.putAll (HashMap חדש (), this.color1DArray); rgbMap.put ("ORANGE", "# FFA500"); }

4.2. ייעודי מַפָּה

ה predicatedMap () שיטה מחזירה א מַפָּה מבטיח שכל האלמנטים המוחזקים תואמים את הקבץ המסופק:

@Test (צפוי = IllegalArgumentException.class) בטל בציבור כאשר AddDuplicate_thenThrowException () {Map uniqValuesMap = MapUtils.predicatedMap (this.colorMap, null, PredicateUtils.uniquePredicate ()); uniqValuesMap.put ("NEW_RED", "# FF0000"); }

כאן ציינו את הפרדיקט לערכים באמצעות PredicateUtils.uniquePredicate (). כל ניסיון להכניס ערך כפול למפה זו יביא ל java.lang.IllegalArgumentException.

אנו יכולים ליישם פרדיקטים מותאמים אישית על ידי יישום ה- לְבַסֵס מִמְשָׁק.

4.3. עָצֵל מַפָּה

lazyMap () מחזירה מפה שבה ערכים מאותחל כאשר מבקשים.

אם מפתח הועבר למפות זה Map.get (אובייקט) השיטה אינה קיימת במפה שַׁנַאי מופע ישמש ליצירת אובייקט חדש שישויך למפתח המבוקש:

@ מבחן ציבורי בטל כאשרCreateLazyMap_theMapIsCreated () {Map intStrMap = MapUtils.lazyMap (HashMap חדש (), TransformerUtils.stringValueTransformer ()); assertThat (intStrMap, הוא (anEmptyMap ())); intStrMap.get (1); intStrMap.get (2); intStrMap.get (3); assertThat (intStrMap, הוא (aMapWithSize (3))); }

5. מסקנה

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

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

הַבָּא » מדריך ל- Apache Commons CircularFifoQueue « קודם מדריך לאוספי אוספי Apons Commons אוספים