الواجهة الوظيفية هي واجهة تحتوي على طريقة مجردة واحدة فقط ، ولكن يمكن أن تحتوي على طرق متعددة غير مجترات.
يمكن تحويل الواجهات الوظيفية ضمنيًا إلى تعبيرات Lambda.
الواجهات الوظيفية يمكن أن تدعم Lambdas الصديقة من خلال الوظائف الحالية.
يقدم
الواجهات الوظيفية هي في الواقع فئة واجهة مجردة. تم العثور على الواجهات الوظيفية التالية قبل Java 8.
java.lang.runnablejava.util.concurrent.callablejava.util.comparator
إلخ...
كيفية استخدام
في الواقع ، يجب تعديل فئة الواجهة المذكورة أعلاه فقط مع شرح توضيحي الوظيفي ، وتصبح واجهة وظيفية في Java. على سبيل المثال ، تعريف الواجهة القابلة للاتصال في JDK
functionalInterFacepublic Interface القابلة للاتصال <v> {v call () رمي الاستثناء ؛}الأمر بهذه البساطة.
الآن دعنا نتحدث عن واجهة الوظيفة الجديدة التي تمت إضافتها إلى Java 8. إليك تعريفها
// t هي المعلمة الواردة // r هي المعلمة return functionalInterFacepublic Interface function <t ، r> {r application (t t) ؛ الافتراضي <v> الدالة <v ، r> compose (function <؟ super v ،؟ يمتد t> قبل {objects.requirenonnull (قبل) ؛ return (v v) -> تطبيق (قبل. بعد. apply (t)) ؛يمكن فهمه على أنه مؤشر وظيفة بلغة C (الرأي الشخصي).
في الاستخدام الفعلي ، يتم استخدام طريقة التطبيق على نطاق واسع. يتم استخدام Compose/then في الغالب في السيناريوهات حيث يتم تنفيذ أكثر من واجهتين وظيفيين وتسلسل التنفيذ.
في رمز الأعمال المحدد ، أستخدمه عمومًا مع Bifuncton/المورد. تدعم Bifunction 2 معلمات ، تدعم الدالة معلمة واحدة فقط. يمكن استخدام المورد لتخزين قيم محددة مطلوبة والحصول عليها من خلال الحصول عليها.
مثال
الإشارات إلى الكود الذي تعمل عليه عادة. يتجنب هذا المثال بشكل أساسي شروط الحكم المتعددة التي تسبب/آخر تسبب في انتفاخ الشفرة. في الوقت نفسه ، يمكن استخلاص نفس منطق العمل من واجهة الوظيفة ، بحيث يمكن إعادة استخدام الرمز في أماكن متعددة. الرمز المحدد كما يلي.
الدالة <object ، integer> actionTest1 = (object) -> {// logic return 0 ؛} ؛ function <object ، integer> actionTest2 = (object) -> {// logic return 0 ؛ hashmap <> () ؛ Maps.put (1 ، ActionTest1) ؛ Maps.put (2 ، ActionTest2) ؛ خرائط الإرجاع ؛} ؛ // استخدم اختبار الفراغ العام (نوع int ، كائن كائن) {اختياري. // if/else logic if (type == 1) {// test1 logic} آخر إذا (type == 2) {// test2 logic}}لخص
أنا شخصياً أعتقد أنه في السيناريوهات التي توجد فيها المزيد من الأحكام حول فروع منطق الأعمال ، يكون من المناسب استخدام الوظيفة ، وهناك الفوائد التالية.
مثال الواجهة الوظيفية
واجهة <T> المسند هي واجهة وظيفية تقبل معلمة الإدخال T وتُرجع نتيجة منطقية.
تحتوي هذه الواجهة على مجموعة متنوعة من الأساليب الافتراضية لدمج المسند في منطقات معقدة أخرى (مثل: مقابل ، أو ، غير).
يتم استخدام هذه الواجهة لاختبار الكائن صحيحة أو خاطئة.
يمكننا أن نفهم استخدام مسند الواجهة الوظيفية <T> من خلال المثال التالي (java8tester.java):
java8tester.java ملف استيراد java.util.arrays ؛ استيراد java.util.list ؛ استيراد java.util.function.predicate ؛ الفئة العامة java8tester {public static void main (string args []) {list <integer> list = arrays.aslist (1 ، 2 ، 3 ، 4 ، 5 ، 6 ، 7 ، 8 ، 9) ؛ // protected <integer> estericate = n -> true // n هي طريقة اختبار تمرر الوسائط إلى الواجهة الأصلية // n إذا كانت هناك ، فإن طريقة الاختبار تُرجع susty.out.println ("OUT جميع البيانات:") ؛ // تمرير المعلمة n eval (list ، n-> true) ؛ // protected <integer> predict1 = n -> n ٪ 2 == 0 // n هي طريقة اختبار تمرر المعلمة إلى الواجهة المسند // إذا كانت طريقة اختبار n ٪ 2 إرجاع STY SYSTEM.OUT.PRINTLN ("خارج جميع الأرقام الزوجية:") ؛ eval (قائمة ، n-> n ٪ 2 == 0) ؛ // protected <integer> predict2 = n -> n> 3 // n هي طريقة اختبار تمرر المعلمة إلى واجهة المسند // إذا كانت n أكبر من 3 طريقة اختبار إرجاع STY SYSTEM.OUT.PRINTLN ("إخراج جميع الأرقام أكبر من 3:") ؛ eval (قائمة ، n-> n> 3) ؛ } eval alucted static static static (list <integer> ، predicate <integer> preport) {for (integer n: list) {if (estercate.test (n)) {system.out.println (n + "") ؛ }}}}تنفيذ البرنامج النصي أعلاه ونتيجة الإخراج هي:
$ javac java8tester.java
$ Java Java8tester
إخراج جميع البيانات:
1
2
3
4
5
6
7
8
9
إخراج جميع الأرقام الزوجية:
2
4
6
8
إخراج جميع الأرقام أكبر من 3:
4
5
6
7
8
9
لخص
ما سبق هو واجهة وظيفية Java 8 وأمثلة الواجهة الوظيفية التي أدخلها المحرر. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!