عند الحديث عن Java 8، أول ما يتبادر إلى ذهنك هو لامدا (الإغلاق) وطريقة الامتداد الافتراضية (الطريقة الافتراضية). في بداية سلسلة Java 8 (JEP126 http://openjdk.java.net/jeps/126)، تم إعادة تصميم بعض مكتبات jdk8 باستخدام تعبيرات lambda. إن فهمها له أهمية كبيرة لتعلم الميزات الجديدة لـ Java 8.
1. واجهة وظيفية
الواجهة الوظيفية (تسمى الواجهة الوظيفية أيضًا الواجهة الوظيفية، ولكنها في الواقع نفس الشيء). ببساطة، الواجهة الوظيفية هي واجهة تحتوي على طريقة واحدة فقط. على سبيل المثال، java.lang.Runnable وjava.util.Comparator في مكتبة Java القياسية هي واجهات وظيفية نموذجية. يوفر Java 8 @FunctionalInterface كتعليق توضيحي. هذا التعليق التوضيحي ليس ضروريًا طالما أن الواجهة تفي بمعايير الواجهات الوظيفية (أي واجهة تحتوي على طريقة واحدة فقط)، فسيقوم الجهاز الظاهري بتحديدها تلقائيًا من الأفضل استخدام التعليق التوضيحي @FunctionalInterface على الواجهة للإعلان عنه، وهذا يمنع الأشخاص الآخرين في الفريق من إضافة طرق جديدة إلى الواجهة عن طريق الخطأ.
لا يمكن أن تظهر Lambda في Java بمفردها، فهي تتطلب واجهة وظيفية للاحتفاظ بها، ونص طريقة تعبير lambda هو في الواقع تنفيذ للواجهة الوظيفية.
2. بناء جملة لامدا
يحتوي على ثلاثة أجزاء
1. المعلمة الرسمية مفصولة بفواصل بين قوسين. المعلمة هي معلمة الطريقة في الواجهة الوظيفية.
2. رمز السهم: ->
3. يمكن أن يكون نص الطريقة عبارة عن تعبير أو كتلة تعليمات برمجية. نص الطريقة هو تنفيذ الطريقة في الواجهة الوظيفية. إذا كانت كتلة تعليمات برمجية، فيجب تغليفها بـ {} وقيمة الإرجاع مطلوبة هناك استثناء. إذا كانت قيمة إرجاع الطريقة في الواجهة الوظيفية فارغة، فلن تكون هناك حاجة إلى {}.
عموما يبدو مثل هذا:
انسخ رمز الكود كما يلي:
(المعلمات) -> التعبير أو (المعلمات) -> { البيانات }؛
انظر المثال الكامل لسهولة الفهم
انسخ رمز الكود كما يلي:
/**
* اختبار تعبير لامدا
*
* @المؤلف بنهيل
*/
الطبقة العامة TestLambda {
تشغيل الفراغ الثابت العامThreadUseLambda() {
// Runnable هي واجهة وظيفية تحتوي فقط على طريقة تشغيل بدون معلمات تُرجع باطلة؛
// لذلك لا توجد معلمات على الجانب الأيسر من تعبير لامدا ولا توجد إرجاع على الجانب الأيمن.
new Thread(() ->System.out.println("تم تنفيذ الخيط بواسطة lambda")).start();
}
تشغيل الفراغ الثابت العامThreadUseInnerClass() {
// لن أتحدث كثيرًا عن هذه الطريقة، لقد كانت طريقة شائعة في الإصدارات القديمة.
موضوع جديد (جديد قابل للتشغيل () {
@تجاوز
تشغيل الفراغ العام () {
System.out.println("تم تنفيذ الموضوع بواسطة فئة داخلية");
}
}).يبدأ()؛
}
public static void main(String[] args) {
TestLambda.runThreadUseLambda();
TestLambda.runThreadUseInnerClass();
}
}
يمكن ملاحظة أن الكود المصمم باستخدام تعبيرات لامدا سيكون أكثر إيجازًا وقابلية للقراءة.
3. مرجع الطريقة
في الواقع، هذه طريقة مبسطة لكتابة تعبير لامدا، الطريقة المشار إليها هي في الواقع طريقة تنفيذ تعبير لامدا، كما أن الجانب الأيسر هو الحاوية (يمكن أن يكون اسم فئة أو اسم مثيل). المنتصف هو "::"، والجانب الأيمن هو اسم الطريقة المقابلة. كما هو موضح أدناه:
انسخ الكود كما يلي: ObjectReference::methodName
تنسيق الاقتباس العام للطريقة هو
إذا كانت طريقة ثابتة، فهي ClassName::methodName. مثل الكائن::يساوي
إذا كانت طريقة مثيل، فهي Instance::methodName. مثل Object obj=new Object();obj::equals;
منشئ.إنه ClassName::new
دعونا نلقي نظرة على مثال كامل لتسهيل الفهم:
انسخ رمز الكود كما يلي:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
*
* @المؤلف بنهيل
*/
الطبقة العامة TestMethodReference {
public static void main(String[] args) {
إطار JFrame = جديد JFrame();
frame.setLayout(new FlowLayout());
frame.setVisible(true);
JButton Button1 = new JButton("انقر فوقي!");
JButton Button2 = new JButton("انقر فوقي أيضًا!");
frame.getContentPane().add(button1);
frame.getContentPane().add(button2);
// معلمة طريقة addActionListener هنا هي ActionListener، وهي واجهة وظيفية
// استخدم طريقة تعبير لامدا
Button1.addActionListener(e -> { System.out.println("هذا هو تطبيق Lambda"); });
// استخدم الطريقة المرجعية
Button2.addActionListener(TestMethodReference::doSomething);
}
/**
* إليك طريقة تنفيذ الواجهة الوظيفية ActionListener
* @param e
*/
الفراغ الثابت العام doSomething(ActionEvent e) {
System.out.println("هذا هو التنفيذ المرجعي للطريقة");
}
}
يمكن ملاحظة أن طريقة doSomething هي تنفيذ تعبير lambda. وتتمثل ميزة ذلك في أنه إذا شعرت أن طريقة lambda طويلة جدًا وتؤثر على سهولة قراءة الكود، فإن مرجع الطريقة هو الحل.
4. ملخص
ما ورد أعلاه هو المحتوى الكامل لصيغة تعبير لامدا، وأعتقد أن كل شخص لديه فهم معين لتعبيرات لامدا، ومع ذلك، إذا كان الكود بسيطًا، فلن يثير إعجاب الكثير من المشاهدين الحاجة إلى تقديم لامدا في جافا 8 لأن لامدا يمكن أن تعمل التعبيرات على تبسيط معالجة البيانات متعددة الخيوط أو متعددة النواة في المجموعة وتوفير سرعة معالجة أسرع للمجموعة. سيتم تقسيم هذه الميزة في JEP126 إلى ثلاثة أجزاء هناك الكثير من الأشياء التي يجب كتابتها. هذا الجزء يجعل القراء على دراية ببناء جملة ومفاهيم تعبيرات لامدا ومراجع الطريقة. الجزء الثاني يدور حول محتوى طرق الامتداد الافتراضية (الطرق الافتراضية). مجموعات البيانات الكبيرة والحلول اكتشف قوة تعبيرات لامدا. ابقوا متابعين. . . .