הפניות לשיטה בג'אווה

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

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

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

ישנם ארבעה סוגים של הפניות לשיטה:

  • שיטות סטטיות
  • שיטות מופע של אובייקטים מסוימים
  • שיטות מופע של אובייקט שרירותי מסוג מסוים
  • בַּנַאִי

במדריך זה נחקור הפניות לשיטות ב- Java.

2. התייחסות לשיטה סטטית

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

הודעות רשימת = Arrays.asList ("שלום", "באלדונג", "קוראים!");

אנו יכולים להשיג זאת על ידי מינוף ביטוי למבדה פשוט המכנה StringUtils.capitalize () שיטה ישירות:

messages.forEach (word -> StringUtils.capitalize (word));

לחלופין, אנו יכולים להשתמש בהתייחסות לשיטה כדי פשוט להתייחס ל לְנַצֵל שיטה סטטית:

messages.forEach (StringUtils :: השתמש באותיות גדולות);

שימו לב כי הפניות לשיטה תמיד משתמשות ב- :: מַפעִיל.

3. התייחסות לשיטת מופע של אובייקט מיוחד

כדי להדגים סוג זה של הפניה לשיטה, בואו ניקח בחשבון שני שיעורים:

אופניים בכיתה ציבורית {מותג מחרוזת פרטי; מסגרת שלמה פרטית גודל: // קונסטרוקטור סטנדרטי, קבצים וקובעים} BicycleComparator מיישמים בכיתה ציבורית Comparator {@Override public int השווה (Bicycle a, Bicycle b) {return a.getFrameSize (). }}

ובוא ניצור Bicomparator התנגד להשוואת גדלי מסגרות אופניים:

BicycleComparator bikeFrameSizeComparator = חדש BicycleComparator ();

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

createBicyclesList (). stream () .sorted ((a, b) -> bikeFrameSizeComparator.compare (a, b));

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

createBicyclesList (). stream () .sorted (bikeFrameSizeComparator :: השווה);

הפניה לשיטה נקייה וקריאה הרבה יותר, מכיוון שהכוונה שלנו מוצגת בבירור בקוד.

4. התייחסות לשיטת מופע של אובייקט שרירותי מסוג מיוחד

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

בואו ניצור מספר שלם רשימה שאנחנו רוצים למיין:

מספרי רשימה = Arrays.asList (5, 3, 50, 24, 40, 2, 9, 18);

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

numbers.stream () .sorted ((a, b) -> a.compareTo (b)); numbers.stream () .sorted (מספר שלם :: CompareTo);

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

5. התייחסות לבנאי

אנו יכולים להתייחס לבנאי באותו אופן שבו התייחסנו לשיטה סטטית בדוגמה הראשונה שלנו. ההבדל היחיד הוא שנשתמש ב- חָדָשׁ מילת מפתח.

בואו ניצור אופניים מערך מתוך א חוּט רשימה עם מותגים שונים:

רשימת bikeBrands = Arrays.asList ("ענק", "סקוט", "טרק", "GT");

ראשית, נוסיף קונסטרוקטור חדש אופניים מעמד:

אופניים ציבוריים (מותג מיתרים) {this.brand = מותג; this.frameSize = 0; } 

בשלב הבא נשתמש בבנאי החדש שלנו מתוך הפניה לשיטה ונעשה a אופניים מערך מהמקור חוּט רשימה:

bikeBrands.stream () .map (אופניים :: חדש) .toArray (אופניים [] :: חדש); 

שימו לב איך קראנו לשניהם אופניים ו מַעֲרָך בונים המשתמשים בהתייחסות לשיטה, מה שמקנה לקוד שלנו מראה הרבה יותר תמציתי וברור.

6. דוגמאות ומגבלות נוספות

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

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

בואו נראה דוגמה למגבלה זו:

createBicyclesList (). forEach (b -> System.out.printf ("מותג האופניים הוא '% s' וגודל המסגרת הוא '% d'% n", b.getBrand (), b.getFrameSize ()));

לא ניתן לבטא מקרה פשוט זה בהתייחסות לשיטה, מכיוון שה- printf השיטה דורשת 3 פרמטרים במקרה שלנו, ושימוש createBicyclesList (). forEach () יאפשר רק להפניה לשיטה להסיק פרמטר אחד ( אופניים לְהִתְנַגֵד).

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

במקרה זה, נרצה להשתמש בביטוי למבדה מבלי להשתמש בפרמטרים שלו.

ראשית, בואו ניצור את doNothingAtAll שיטה:

ריק סטטי פרטי doNothingAtAll (אובייקט ... o) {}

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

עכשיו בואו נראה את זה בפעולה:

createBicyclesList () .forEach ((o) -> MethodReferenceExamples.doNothingAtAll (o)); 

7. מסקנה

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

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