الواجهة الوظيفية في Java هي واجهة تحتوي على طريقة مجردة واحدة فقط. والغرض الرئيسي هو استخدامه في تعبيرات لامدا ومراجع الطريقة.
الشرط الوحيد هو وجود طريقة مجردة واحدة، لذلك يمكن أن تحتوي الواجهة الوظيفية أيضًا على
لن أتطرق إليهم بالتفصيل. ألاحظ أن الأكثر استخدامًا هي: Consumer<T> ، و Function<T,R> ، و Predicate<T> ، ومورد<T> ، و UnaryOperator<T> وأشكالها الثنائية . يمكن العثور على مزيد من التفاصيل في صفحة الوثائق: الحزمة java.util.function
default
طرق static
. يمكنك إضافة تعليق توضيحي @FunctionalInterface إلى الواجهة الوظيفية. هذا غير مطلوب، ولكن إذا كان هذا التعليق التوضيحي موجودًا، فلن يتم تجميع الكود إذا كان هناك أكثر أو أقل من طريقة مجردة واحدة. يوصى بإضافة @FunctionalInterface. سيسمح لك هذا باستخدام الواجهة في تعبيرات lambda دون القلق من قيام شخص ما بإضافة طريقة مجردة جديدة إلى الواجهة وستتوقف عن العمل. تحتوي 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