JavaRush /مدونة جافا /Random-AR /مقدمة للواجهات الوظيفية
minuteman
مستوى

مقدمة للواجهات الوظيفية

نشرت في المجموعة
من فضلك لا تتصيد كثيرًا، لقد بدأت للتو في ترجمة المقالات مقدمة للواجهات الوظيفية - 1

مقدمة للواجهات الوظيفية - المفاهيم المعاد إنشاؤها في Java 8

استخدم كل مطور Java في العالم إحدى الواجهات التالية مرة واحدة على الأقل: java.lang.Runnable, java.awt.event.ActionListener, java.util.Comparator, java.util.concurrent.Callable. لديهم جميعًا شيء واحد مشترك، وهو أن لديهم جميعًا طريقة واحدة فقط. هناك العديد من الواجهات الأخرى المشابهة في JDK، بالإضافة إلى واجهات أخرى أنشأها مطورو Java. تُعرف هذه الواجهات أيضًا باسم Single Abstract Method interfaces(واجهات SAM). ومن أشهر الطرق لاستخدام هذه الواجهات هي إنشاء فئات داخلية مجهولة تستخدم هذه الواجهات، كما في المثال التالي:
public class AnonymousInnerClassTest {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("A thread created and running...");
            }
        }).start();
    }
}
في Java 8، يتم إعادة إنشاء مفهوم SAM ويسمى الواجهات الوظيفية. ويمكن تمثيلها باستخدام تعبيرات لامدا، ومراجع الطريقة، ومنشئات المراجع. تم إنشاء تعليق توضيحي @FunctionalInterface جديد يُستخدم لإلقاء الأخطاء على مستوى المترجم عندما لا تعمل الواجهة التي قمت بالتعليق عليها على المستوى الوظيفي. دعونا نلقي نظرة على واجهة وظيفية بسيطة باستخدام طريقة مجردة واحدة:
@FunctionalInterface
public interface SimpleFunInterface {
    public void doWork();
}
يمكن للواجهة أيضًا أن تعلن عن طرق مجردة من فئة java.lang.Object، ولكن في هذه الحالة يمكن أيضًا أن تعلن الواجهة أنها وظيفية:
@FunctionalInterface
public interface SimpleFuncInterface {
    public void doWork();
    public String toString();
    public Boolean equals(Object o);
}
بمجرد إضافة طريقة مجردة أخرى إلى الواجهة، سيضع IDE علامة عليها على أنها خاطئة كما في الصورة: مقدمة للواجهات الوظيفية - 2 يمكن أن ترث الواجهة من واجهة أخرى؛ إذا كانت الواجهة ترث من واجهة وظيفية ولا تحتوي على طرق مجردة جديدة، فإن هذه الواجهة تعمل أيضًا. لكن الواجهة يمكن أن تحتوي فقط على طريقة مجردة واحدة والعديد من الطرق الافتراضية، وستظل تعتبر وظيفية.
@FunctionalInterface
public interface ComplexFunctionalInterface extends SimpleFuncInterface {
    default public void doSomeWork() {
        System.out.println("Doing some work in interface impl...");
    }
    default public void doSomeWork() {
        System.out.println("Doing some other work in interface impl...");
    }
}
المثال الأعلى لا يزال واجهة وظيفية. الآن دعونا نلقي نظرة على كيفية استخدام تعبيرات لامدا لاستبدال فئة داخلية مجهولة لتنفيذ واجهات وظيفية:
/*
*Implementation the interface by creating an
*anonymoous inner class versus using
*lambda expression.
*/
public class SimpleFunInterfaceTest {
    public static void main(String[] args) {
        carryOutWork(new SimpleFunInterface() {
            @Override
            public void doWork() {
                System.out.println("Do work in SimpleFun impl...");
            }
        });
        carryOutWork(() -> System.out.println("Do work in lambda exp impl..."));
    }
    public static void carryOutWork(SimpleFuncInterface sfi) {
        sfi.work();
    }
}
وستكون نتيجة البرنامج على النحو التالي:
Do work in SimpleFun impl...
Do work in lambda exp impl...
في حال كنت تستخدم IDE يدعم بناء جملة تعبير Java lambda (إصدارات Netbeans 8 Nightly) - ستحصل على تلميح عند استخدام فئات داخلية مجهولة: مقدمة للواجهات الوظيفية - 3 كانت هذه مقدمة مختصرة لمفهوم الواجهات الوظيفية في Java 8 وكيف يمكن تنفيذها باستخدام تعبيرات لامدا.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION