أول تعبير لامدا
قبل ظهور Lambda ، إذا كنا بحاجة إلى كتابة Multithread ، فقد نحتاج إلى الطريقة التالية:
RunNable RunNable = new RunNable () {Override public void run () {system.out.println ("hello runnable") ؛ }} ؛ ... thread.start () ؛سيكون المثال أعلاه أسهل بكثير إذا قمت بتغيير إلى استخدام Lambda:
runnable noargs = ()-> system.out.println ("Hello lambda! ~") ؛ ... thread.start () ؛تعبير Lambda هو دالة مجهولة المصدر تمرر السلوك مثل البيانات. يستخدم التعبير -> لفصل المعلمات عن الجسم ، -> لسبق جزء المعلمة ، ثم هذا هو جزء الجسم.
أشكال أخرى من لامدا
BinaryOperator <Brong> add = (x ، y)-> x+y ؛ // أو BinaryOperator <Rong> add = (long x ، long y)-> x+y ؛ // أو BinaryOperator <Long> add = (long x ، long y)-> {x+y ؛ } ؛ما ورد أعلاه كل أشكال تعبيرات lambda.
ثم السؤال هو:
ما الذي يقوم به BinaryOperator <Rong> Add = (Long X ، Long Y)-> x+y ؛ يقصد؟
لا يتحدث سطر الكود هذا عن إضافة أرقام ، ولكنه ينشئ وظيفة لحساب نتيجة إضافة رقمين. نوع الإضافة هو BinaryOperator <Bong> ، وهو ليس مجموع رقمين ، ولكن الرمز الذي يضيف رقمين. يوضح المثال التالي كيفية استخدام هذا المتغير:
BinaryOperator <Rong> add = (long x ، long y)-> x+y ؛ long res = add.apply (3l ، 4l) ؛ System.out.println ("res ="+res) ؛ // الإخراج: res = 7 واجهة وظيفة
واجهة الوظيفة هي واجهة ذات طريقة مجردة واحدة فقط ، تستخدم كنوع من تعبير Lambda.
على سبيل المثال ، Runnable هو واجهة وظيفة.
إنشاء واجهة وظيفة جديدة:
addOperator الواجهة العامة <t ، d> {long add (t one ، d اثنين) ؛}يستخدم:
AddOperator <long ، long> addOperator = (x ، y)-> x +y ؛ System.Err.println ("Custom Function Beasherer Res ="+AddOperator.add (34L ، 65L)) ؛ نوع الهدف
يشير النوع الهدف إلى نوع السياق الذي يوجد فيه تعبير Lambda. على سبيل المثال ، قم بتعيين تعبير Lambda إلى متغير محلي ، أو تمريره إلى طريقة كمعلمة. نوع المتغير المحلي أو المعلمة الطريقة هو النوع الهدف لتعبير Lambda.
أخير
إذا أشرنا إلى المتغير المحلي في الطريقة في الفئة الداخلية المجهولة ، فهذا يتطلب أن يكون المتغير المحلي نهائيًا.
في Lambda ، لا نحتاج إلى إعلان المتغير المحلي الخارجي المشار إليه على أنه نهائي ، ولكن لا يمكن تعيين المتغير إلا مرة واحدة.
في المثال التالي ، إذا أزلنا التعليقات وقمنا بتعيين الاسم مرة أخرى ، فلن يتم تجميعه وسيتم عرض رسالة خطأ: يجب أن تكون المتغيرات المحلية المشار إليها من تعبير Lambda نهائيًا أو فعليًا.
يجب أن يكون المتغير المحلي المشار إليه بتعبير Lambda نهائيًا أو نهائيًا واقعيًا.
اسم السلسلة = getUserName () ؛ // name = "hi" ؛ button.addActeListener (event-> system.out.println ("name ="+name)) ؛ اكتب الاستدلال
إن الاستدلال على نوع تعبيرات Lambda هو امتداد لاستدلال نوع الهدف الذي تم تقديمه في Java7.
اكتب الاستدلال في Java7:
قائمة <Tring> list = new ArrayList <> () ؛
في المثال أعلاه ، لم نحدد نوع النموذج من قائمة ArrayList ، ولكن بدلاً من ذلك استنتجوا نوع النموذج من قائمة ArrayList استنادًا إلى نوع القائمة.
على سبيل المثال: AddOperator <long ، long> addOperator = (x ، y)-> x +y ؛
من خلال هذه المقالة ، آمل أن يساعدك في تعلم وفهم هذا الجزء من المعرفة. شكرا لدعمكم لهذا الموقع!