שיעורי מודול (1/2)
ביטויי למדה
החל מ-Java 8, תכנות פונקציונלי נתמך באמצעות Lambda Expressions. ביטוי למבדה הוא בעצם שיטה אנונימית (פונקציה ללא שם) שניתן להעביר כארגומנט לשיטות או לאחסן במשתנים.
ממשקים פונקציונליים
ניתן להשתמש בביטוי למבדה רק כאשר נדרש ממשק פונקציונלי. ממשק פונקציונלי הוא ממשק שמצהיר על שיטה מופשטת אחת בדיוק. Java מסמנת את הממשקים הללו עם ההערה האופציונלית @FunctionalInterface.
דוגמה לממשק פונקציונלי מוגדר על ידי משתמש:
@FunctionalInterface
interface MathOperation {
int operate(int a, int b);
}לפני Java 8, תצטרך להגדיר מחלקה פנימית אנונימית. עם למבדות, התחביר מפושט ל:
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Returns 8מבנה של ביטויי למדה
התחביר הבסיסי של למבדה הוא:
(parameters) -> { body }
- ללא פרמטרים:
() -> System.out.println("Hello") - פרמטר בודד:
x -> x * 2(ניתן להשמיט סוגריים) - פרמטרים מרובים:
(x, y) -> x + y - גוף מרובה שורות: אם הגוף מכיל הצהרות מרובות, יש צורך בסוגריים
{}והצהרתreturnמפורשת.
MathOperation detailedAddition = (a, b) -> {
System.out.println("Adding...");
return a + b;
};ממשקים פונקציונליים סטנדרטיים ב-Java
חבילת java.util.function מספקת מספר ממשקים פונקציונליים מובנים:
Predicate<T>: מקבל ארגומנט מסוגTומחזיר בוליאני (שיטתtest(T t)).Consumer<T>: מקבל ארגומנט מסוגTומבצע פעולה מבלי להחזיר תוצאה (שיטתaccept(T t)).Function<T, R>: מקבל ארגומנטTומחזיר תוצאהR(שיטתapply(T t)).Supplier<T>: לא מקבל ארגומנטים ומחזיר ערך מסוגT(שיטתget()).
נסה זאת בעצמך
השלם את הקוד על ידי יצירת ממשק המחשבון באמצעות ביטוי למבדה המוסיף שני מספרים שלמים. לאחר מכן, הפעל את שיטת החישוב העוברת את 5 ו-3, והדפיס את התוצאה.
הצג רמז
הכריז על `Calculator adder = (a, b) -> a + b;` ולאחר מכן הפעל `adder.calculate(5, 3)` בתוך קריאת ההדפסה.
הפתרון זמין לאחר 3 ניסיונות
צור מופע של הממשק הפונקציונלי הסטנדרטי Predicate<String> בשם isLong באמצעות ביטוי למבדה שבודק אם אורך המחרוזת גדול מ-5 תווים. לאחר מכן הדפס את תוצאת הבדיקה עבור 'שלום עולם'.
הצג רמז
הלמבדה של `Predicate<String>` לוקחת פרמטר `s` ומחזירה `s.length() > 5` כתנאי בוליאני.
הפתרון זמין לאחר 3 ניסיונות
מיין את רשימת שמות המחרוזות בסדר אלפביתי על ידי הפעלת המתודה sort() עליה והעברת ביטוי lambda שמיישם Comparator (לקיחת שתי מחרוזות s1, s2 והשוואה ביניהן באמצעות compareTo).
הצג רמז
השתמש ב-'names.sort((s1, s2) -> s1.compareTo(s2));' כדי למיין את הרשימה במקום.
הפתרון זמין לאחר 3 ניסיונות