ממשק פונקציונלי ב-Java הוא ממשק המכיל רק שיטה אבסטרקטית אחת. המטרה העיקרית היא להשתמש בו בביטויי למבדה והפניות לשיטה.
הנוכחות של שיטה מופשטת אחת היא התנאי היחיד, כך שממשק פונקציונלי יכול להכיל גם
לא אתעכב עליהם בפירוט. אני מציין שהשימושים הנפוצים ביותר הם: Consumer<T> , Function<T,R> , Predicate<T> , Supplier<T> , UnaryOperator<T> וצורות הבי שלהם . פרטים נוספים ניתן למצוא בעמוד התיעוד: Package java.util.function
default
שיטות static
. אתה יכול להוסיף את ההערה @FunctionalInterface לממשק פונקציונלי. זה לא נדרש, אבל אם ההערה הזו קיימת, הקוד לא יקמפל אם יש יותר או פחות מתודה מופשטת אחת. מומלץ להוסיף את @FunctionalInterface. זה יאפשר לך להשתמש בממשק בביטויי למבדה מבלי לדאוג שמישהו יוסיף שיטה מופשטת חדשה לממשק והיא תפסיק להיות פונקציונלית. ל-Java יש ממשקים פונקציונליים מובנים הנמצאים ב- java.util.function
.
מה עוד לקרוא: |
---|
import java.util.function.Predicate;
//Определяем свой функциональный интерфейс
@FunctionalInterface
interface MyPredicate {
boolean test(Integer value);
}
public class Tester {
public static void main(String[] args) throws Exception {
MyPredicate myPredicate = x -> x > 0;
System.out.println(myPredicate.test(10)); //true
//Аналогично, но используется встроенный функциональный интерфейс java.util.function.Predicate
Predicate<Integer> predicate = x -> x > 0;
System.out.println(predicate.test(-10)); //false
}
}
אבל מסתבר שיש נקודה עדינה אחת המתוארת במפרט שפת Java: "ממשקים אינם יורשים מאובייקט, אלא מכריזים באופן מרומז על רבות מאותן שיטות כמו אובייקט." המשמעות היא שממשקים פונקציונליים יכולים להכיל בנוסף שיטות מופשטות המוגדרות במחלקה Object
. הקוד שלהלן חוקי, לא יהיו שגיאות קומפילציה או זמן ריצה:
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
// другие default or static методы
}
היזהר במהלך הראיון! בהצלחה!
GO TO FULL VERSION