דילוג לתוכן המרכזי
מודול 7 · שיעור 1 מתוך 213/14 בקורס~12 min
שיעורי מודול (1/2)

ביטויי למדה

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

ממשקים פונקציונליים

ניתן להשתמש בביטוי למבדה רק כאשר נדרש ממשק פונקציונלי. ממשק פונקציונלי הוא ממשק שמצהיר על שיטה מופשטת אחת בדיוק. Java מסמנת את הממשקים הללו עם ההערה האופציונלית @FunctionalInterface.

דוגמה לממשק פונקציונלי מוגדר על ידי משתמש:

Java
@FunctionalInterface
interface MathOperation {
    int operate(int a, int b);
}

לפני Java 8, תצטרך להגדיר מחלקה פנימית אנונימית. עם למבדות, התחביר מפושט ל:

Java
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Returns 8

מבנה של ביטויי למדה

התחביר הבסיסי של למבדה הוא:

Code
(parameters) -> { body }
  • ללא פרמטרים: () -> System.out.println("Hello")
  • פרמטר בודד: x -> x * 2 (ניתן להשמיט סוגריים)
  • פרמטרים מרובים: (x, y) -> x + y
  • גוף מרובה שורות: אם הגוף מכיל הצהרות מרובות, יש צורך בסוגריים {} והצהרת return מפורשת.
Java
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()).

נסה זאת בעצמך

פעילות גופנית#java.m7.l1.e1
ניסיונות: 0טוען...

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

טוען עורך...
הצג רמז

הכריז על `Calculator adder = (a, b) -> a + b;` ולאחר מכן הפעל `adder.calculate(5, 3)` בתוך קריאת ההדפסה.

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#java.m7.l1.e2
ניסיונות: 0טוען...

צור מופע של הממשק הפונקציונלי הסטנדרטי Predicate<String> בשם isLong באמצעות ביטוי למבדה שבודק אם אורך המחרוזת גדול מ-5 תווים. לאחר מכן הדפס את תוצאת הבדיקה עבור 'שלום עולם'.

טוען עורך...
הצג רמז

הלמבדה של `Predicate<String>` לוקחת פרמטר `s` ומחזירה `s.length() > 5` כתנאי בוליאני.

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#java.m7.l1.e3
ניסיונות: 0טוען...

מיין את רשימת שמות המחרוזות בסדר אלפביתי על ידי הפעלת המתודה sort() עליה והעברת ביטוי lambda שמיישם Comparator (לקיחת שתי מחרוזות s1, s2 והשוואה ביניהן באמצעות compareTo).

טוען עורך...
הצג רמז

השתמש ב-'names.sort((s1, s2) -> s1.compareTo(s2));' כדי למיין את הרשימה במקום.

הפתרון זמין לאחר 3 ניסיונות