ממשקים פונקציונליים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 39 מתוך 87.
ממשק פונקציונלי הוא ממשק שמכיל בדיוק מתודה מופשטת אחת. האילוץ הזה, של מתודה אחת בלבד, הופך ממשקים פונקציונליים למיוחדים, מכיוון שאפשר לממש אותם באמצעות ביטויי למבדה, וכך לכתוב קוד תמציתי יותר.
Java מספקת את ההערה @FunctionalInterface כדי לסמן במפורש ממשק כפונקציונלי. אף שההערה אינה חובה, היא עוזרת למהדר לזהות שגיאות אם בטעות מוסיפים מתודה מופשטת שנייה:
@FunctionalInterface
public interface Calculator {
int calculate(int a, int b);
}אפשר לממש ממשק פונקציונלי בדרך המסורתית באמצעות מחלקה, או בצורה תמציתית יותר באמצעות ביטוי למבדה:
// מימוש מסורתי
Calculator adder = new Calculator() {
@Override
public int calculate(int a, int b) {
return a + b;
}
};
// ביטוי למבדה (הרבה יותר קצר!)
Calculator adder = (a, b) -> a + b;
System.out.println(adder.calculate(5, 3)); // 8לממשקים פונקציונליים עדיין יכולות להיות מתודות ברירת מחדל ומתודות סטטיות, מכיוון שהן אינן נחשבות לכלל המתודה האבסטרקטית היחידה. החבילה java.util.function של Java מספקת ממשקים פונקציונליים מובנים רבים כמו Predicate, Function ו־Consumer, שתיתקלו בהם לעיתים קרובות בעבודה עם זרמים ואוספים.
אתגר
קלבואו נבנה מערכת לשינוי מחרוזות באמצעות ממשקים פונקציונליים וביטויי lambda. תיצרו מעבד טקסט גמיש שיכול להחיל על מחרוזות פעולות שינוי שונות: הכול מופעל באמצעות ממשק פונקציונלי יחיד.
תארגנו את הקוד שלכם בשלושה קבצים:
StringTransformer.java: הגדירו ממשק פונקציונלי שמייצג כל פעולת שינוי של מחרוזת. סמנו אותו בהערה@FunctionalInterfaceכדי לוודא שהוא נשאר פונקציונלי. על הממשק שלכם להצהיר על מתודה מופשטת יחידה בשםtransformשמקבלת String ומחזירה String.TextProcessor.java: צרו מחלקה שמשתמשת בממשק הפונקציונלי שלכם כדי לעבד טקסט. צרו בה שדה שיחזיקStringTransformerובנאי שיאתחל אותו. הוסיפו מתודה בשםprocess(String text)שמחילה את המתמיר על הטקסט הנתון ומחזירה את התוצאה. התכנון הזה מאפשר לכם להעביר כל התנהגות של שינוי דרך הבנאי.Main.java: חברו את כל החלקים יחד על ידי יצירת פעולות שינוי שונות באמצעות ביטויי lambda. תקבלו שתי קלטים: מחרוזת טקסט וסוג פעולה (upper,lowerאוreverse).בהתאם לסוג הפעולה, צרו
TextProcessorעם ביטוי ה-lambda המתאים:upper: משנה את הטקסט לאותיות גדולותlower: משנה את הטקסט לאותיות קטנותreverse: הופך את סדר התווים בטקסט (רמז: השתמשו ב-StringBuilder)
לאחר מכן קראו ל-
process()עם טקסט הקלט והדפיסו את התוצאה בפורמט הזה:Result: [transformed text]
תקבלו שתי קלטים: הטקסט שיש לשנות (String) וסוג הפעולה (String).
שימו לב איך אותה מחלקת TextProcessor יכולה לבצע פעולות שונות לחלוטין, בהתאם לביטוי ה-lambda שאתם מעבירים לה: זהו הכוח של ממשקים פונקציונליים!
נסו בעצמכם
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String text = scanner.nextLine();
String operation = scanner.nextLine();
TextProcessor processor;
// TODO: בהתאם לסוג הפעולה, צרו TextProcessor עם ביטוי הלמבדה המתאים:
// - "upper": ממיר את הטקסט לאותיות רישיות
// - "lower": ממיר את הטקסט לאותיות קטנות
// - "reverse": הופך את סדר התווים בטקסט (רמז: השתמשו ב-StringBuilder)
// TODO: קראו ל-process() עם טקסט הקלט והדפיסו את התוצאה
// פורמט הפלט: "Result: [transformed text]"
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא לתכנות מונחה עצמיםמחלקות לעומת אובייקטיםמילת המפתח thisמתודותשדות (מאפיינים)מתודת הבנאיהעמסת בנאיםחזרה – מחשבון פשוט4ירושה
ירושה בסיסית (extends)מילת המפתח superדריסת מתודות (@Override)שרשור בנאיםהמחלקה Objectירושה יחידה ורב־רמתיתלמה אין ירושה מרובה של מחלקותסיכום – היררכיית עובדים7מתודות מיוחדות ומחלקת Object
מתודת toString()equals() ו-hashCode()מתודת clone()compareTo() ו-Comparableהממשק Comparatorסיכום – מיון מותאם אישית2מצייני גישה ואנקפסולציה
סקירה של רמות הגישהמתודות Getter ו-Setterהסתרת מידעמילת המפתח finalסיכום – מנהל חשבון בנק5פולימורפיזם
יסודות העמסת מתודותדריסת מתודות (בזמן ריצה)המרה כלפי מעלה וכלפי מטההאופרטור instanceofמחלקות ומתודות מופשטותסיכום – מחשבון צורות8מושגי OOP מתקדמים
הרכבה מול ירושהאגרגציה מול הרכבהמחלקות פנימיות, מקוננות ואנונימיותEnums ומתודות של EnumRecords (Java 16+)מחלקות חתומות (Java 17+)3מאפייני מחלקה וחברים סטטיים
משתני מופע לעומת משתנים סטטייםמתודות סטטיותבלוקים סטטייםקבועים (static final)סיכום — מונה ומחלקת עזר6ממשקים ומחלקות מופשטות
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםמתודות ברירת מחדל וסטטיות בממשקמחלקות מופשטות לעומת ממשקיםממשקים פונקציונלייםסיכום – מערכת תשלומיםתרגלו בעצמכם: קומפיילר Java אונליין