ההבדל בין map () ו- flatMap ()

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

מַפָּה() ו flatMap () ממשקי API נובעים משפות פונקציונליות. ב- Java 8, אתה יכול למצוא אותם ב- אופציונלי, זרם ובתוך העתיד (אם כי תחת שם שונה במקצת).

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

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

2. מפה ו- Flatmap באופציות

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

אופציונלי s = Optional.of ("מבחן"); assertEquals (Optional.of ("TEST"), s.map (String :: toUpperCase));

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

בואו נראה דוגמה נוספת כדי להבין טוב יותר את המצב הזה:

assertEquals (Optional.of (Optional.of ("STRING")), Optional .of ("string") .map (s -> Optional.of ("STRING")));

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

זה בדיוק מה flatMap () עוזר לנו לעשות:

assertEquals (Optional.of ("STRING"), Optional .of ("string") .flatMap (s -> Optional.of ("STRING")));

3. מפה ו- Flatmap בזרמים

שתי השיטות פועלות באופן דומה עבור אופציונאלי.

ה מַפָּה() השיטה עוטפת את הרצף הבסיסי ב- זרם למשל, ואילו flatMap () השיטה מאפשרת הימנעות מקנן זרם מִבְנֶה.

בדוגמה הבאה, מַפָּה() מייצר א זרם המורכב מתוצאות החלת ה- toUpperCase () שיטה לאלמנטים של הקלט זרם:

רשימת myList = Stream.of ("a", "b") .map (String :: toUpperCase) .collect (Collectors.toList ()); assertEquals (asList ("A", "B"), myList);

מַפָּה() עובד די טוב במקרה כל כך פשוט, אבל מה אם יש לנו משהו מורכב יותר כמו רשימת רשימות כקלט.

בואו נראה איך זה עובד:

רשימה list = Arrays.asList (Arrays.asList ("a"), Arrays.asList ("b")); System.out.println (רשימה);

קטע זה מדפיס רשימת רשימות [[a], [b]].

עכשיו, בואו נשתמש ב- flatMap ():

System.out.println (רשימה .stream () .flatMap (אוסף :: stream) .collect (Collectors.toList ()));

התוצאה של קטע כזה תשטח ל [א, ב].

טהוא flatMap () השיטה משטחת את הקלט תחילה זרם שֶׁל זרמים אל א זרם שֶׁל מיתרים (למידע נוסף על השטחה ראו מאמר). לאחר מכן זה עובד בדומה ל מַפָּה() שיטה.

4. מסקנה

Java 8 נותן לנו את האפשרות להשתמש ב- מַפָּה() ו flatMap () שיטות ששימשו במקור בשפות פונקציונליות.

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

כמו תמיד, תוכל לבדוק את הדוגמאות המופיעות במאמר זה ב- GitHub.