מיפוי רשימות עם ModelMapper

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

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

2. ממפה מודל

התפקיד העיקרי של ModelMapper הוא למפות אובייקטים על ידי קביעת אופן מיפוי מודל אובייקט אחד לאחר שנקרא אובייקט טרנספורמציה נתונים (DTO).

על מנת להשתמש ב- ModelMapper, אנו מתחילים להוסיף את התלות שלנו pom.xml:

 org.modelmapper modelmapper 2.3.7 

2.1. תְצוּרָה

ModelMapper מספק מגוון תצורות כדי לפשט את תהליך המיפוי. אנו מתאימים אישית את התצורה על ידי הפעלה או השבתה של המאפיינים המתאימים בתצורה. זה נוהג נפוץ לקביעת fieldMatchingEnabled נכס ל נָכוֹן ולאפשר התאמת שדות פרטית:

modelMapper.getConfiguration () .setFieldMatchingEnabled (true) .setFieldAccessLevel (Configuration.AccessLevel.PRIVATE); 

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

2.2. הקלד אסימון

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

רשימת מספרים שלמים = ArrayList חדש (); מספרים שלמים. להוסיף (1); מספרים שלמים. להוסיף (2); מספרים שלמים. להוסיף (3); תווי רשימה = ArrayList חדש (); modelMapper.map (מספרים שלמים, תווים);

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

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

תווי רשימה = modelMapper.map (מספרים שלמים, TypeToken חדש() {} .getType ());

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

3. שימוש במיפוי סוג מותאם אישית

ניתן למפות רשימות ב- Java באמצעות סוגי רכיבים מותאמים אישית.

לדוגמא, נניח שאנחנו רוצים למפות רשימה של מִשׁתַמֵשׁ ישויות לא UserDTO רשימה. כדי להשיג זאת, אנו מתקשרים מַפָּה לכל אלמנט:

רשימת dtos = משתמשים .stream () .map (user -> modelMapper.map (user, UserDTO.class)) .collect (Collectors.toList ());

כמובן, עם עוד קצת עבודה נוכל ליצור שיטה פרמטרית לכללית:

 רשימת mapList (מקור רשימה, Class targetClass) {מקור החזרה .stream () .map (element -> modelMapper.map (element, targetClass)) .collect (Collectors.toList ()); }

אז נוכל לעשות זאת:

רשימת userDtoList = mapList (משתמשים, UserDTO.class);

4. הקלד מפה ומיפוי נכסים

ניתן להוסיף מאפיינים ספציפיים כגון רשימות או קבוצות User-UserDTO דֶגֶם. TypeMap מספק שיטה להגדרה מפורשת של מיפוי מאפיינים אלה. ה TypeMap אובייקט מאחסן מידע על מיפוי מסוגים (מחלקות) ספציפיים:

TypeMap typeMap = modelMapper.createTypeMap (UserList.class, UserListDTO.class);

רשימת משתמש הכיתה מכילה אוסף של מִשׁתַמֵשׁס. הנה, w ברצונך למפות את רשימת שמות המשתמשים מאוסף זה לרשימת הנכסים של ה UserListDTO מעמד. כדי להשיג זאת, ניצור קודם UserListConverter בכיתה ולעבור אותה רשימה ו רשימה כסוגי פרמטרים להמרה:

מחלקה ציבורית UsersListConverter מרחיב את AbstractConverter {@Override מוגן רשימה המרת (משתמשים משתמשים) {להחזיר משתמשים .stream () .map (משתמש :: getUsername) .collect (Collectors.toList ()); }}

מהנברא TypeMap אובייקט אנו מוסיפים במפורש מיפוי נכסים על ידי הפעלת מופע של UserListConverter מעמד:

 typeMap.addMappings (mapper -> mapper.using (UserListConverter חדש ()) .map (UserList :: getUsers, UserListDTO :: setUsernames));

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

5. מסקנה

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

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


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