374. Java 8 Lambda expressions

בהמשך לטיפים על הגרסה הבאה של Java, להלן טיפ על הFeature האחרון שמתווסף לשפה בJava 8.

הFeature נקרא Lambda Expressions, והוא מוכר לנו מC# (ראו גם טיפ מספר 45).

ראינו בטיפ מספר 370 הסבר על Single abstract methods (SAM).

אחת השיטות (וכנראה השיטה העיקרית) לאתחל Single abstract method היא באמצעות Lambda Expressions:

נניח שיש לנו את הממשק הבא:

1
2
3
public interface Comparator<T> {
public int compare(T o1, T o2);
}

נניח שאנחנו רוצים ליצור מימוש שלו.

עד Java 8 היינו צריכים לכתוב משהו כזה:

1
2
3
4
5
6
7
Comparator<String> comparator =
new Comparator<String>() {
@Override
public int compare(String x, String y) {
return (x.length() - y.length());
}
};

נוכל ליצור מימוש שלו בצורה הבאה:

1
Comparator<String> comparator = (x, y) -> (x.length() - y.length());

הסינטקס דומה לזה של C#, רק שכאמור אין delegate אלא SAMים.

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

1
2
3
4
public static void sortTeamsByLength(String[] teams) {
Comparator<String> comparator = (x, y) -> (x.length() - y.length());
Arrays.sort(teams, comparator);
}

או אפילו ישר ככה:

1
2
3
public static void sortTeamsByLength(String[] teams) {
Arrays.sort(teams, (x, y) -> (x.length() - y.length()));
}

בסה"כ מדובר בדבר נחמד, נראה שיש יתרון בבחירה להשתמש בSAM בהתחשב בעובדה שהרבה מהפונקציות של הFramework יודעות לעבוד עם הממשקים כנ"ל.

סופ"ש אנונימי טוב.

שתף