جافا 8: المادة سيد تعبيرات لامدا | CSDN بوين اختيار

الكاتب | كبيرة الروبوت شقيق قوي

ذبيان | قوه روي

أنتجت | CSDN بلوق

يقدم هذا المقال جافا 8 تعبيرات لامدا الجديدة، بما في ذلك استخدام الاستعمال الشائع، وطرق لامبدا عبارات مرجعية، وتحليلات تعبيرات لامدا حيث المبدأ، وكان آخر من مزايا وعيوب تعبيرات لامدا هي ملخص.

الخطوط العريضة

دور جافا الرئيسي لامدا التعبيرات هو تبسيط الصياغة التي أدخلت في 8 أجزاء الطبقات الداخلية مجهول.

تكون قادرة على استخدام أساسا هاما يجب أن يكون التعبير لامدا واجهة وظيفة مناسبة. ما يسمى واجهة وظيفة، ويشير فقط إلى الواجهة الداخلية للأسلوب التجريدي.

تستند تعبيرات لامدا على آلية نوع الاستدلال آخر. في المعلومات سياق غير كافية، يمكن للمترجم الاستدلال نوع من الجدول المعلمة، دون الحاجة لاسم صريح.

الاستخدام الشائع

2.1 عدم الحجة وظيفة الاختزال

لم يشر هي وظيفة بدون وسائط، مثل Runnable واجهة طريقة المدى، والتي تم تعريفها على النحو التالي:

FunctionalInterface

الواجهة العمومية Runnable {

العام المدى باطل مجردة.

}

في جافا 7 و في وقت سابق، ونحن عموما استخدام:

جديد الموضوع (Runnable الجديد {

Override

المدى باطل العام {

System.out.println ( "مرحبا")؛

System.out.println ( "جيمي")؛

}

}) ابدأ.

8 ابتداء من جاوة، ويمكن اختصار الطبقات الداخلية لا المجهولة كمعلمات وظيفة على النحو التالي:

 - >  {

تنفيذ العبارة

}

هذه الواجهات وأسماء وظيفة يمكن تفويتها. حسنا، في على سبيل المثال يمكن اختصارها إلى:

جديد الموضوع (- >  {

System.out.println ( "مرحبا")؛

System.out.println ( "جيمي")؛

}) ابدأ.

عندما فقط عبارة واحدة، يمكننا كتلة التعليمات البرمجية أيضا الاختزال، والشكل التالي:

 - >  التعبير

لاحظ استخدام تعبير، ليس بيانا، التي لا تتطلب فاصلة منقوطة في نهاية المطاف.

ثم، عندما في أمثلة من عبارات تنفيذها مرة واحدة فقط، ويمكن اختصار هذا القبيل:

جديد الموضوع (- >  . System.out.println ( "مرحبا")) بدء؛

2.2 احدة وظيفة اختزال المرجعية

وظيفة الأحادية هي وظيفة من معلمة واحدة فقط. عند_النقر سبيل المثال، وسيلة لواجهة داخل OnClickListener عرض (عرض ت)، والتي تم تعريفها على النحو التالي:

الواجهة العمومية OnClickListener {

/ **

* دعا عندما تم النقر على عرض.

*

*param الخامس ال  عرض الذي تم النقر عليه.

* /

باطلة عند _ النقر (عرض الخامس)؛

}

7 والإصدارات السابقة من جاوة، ونحن عادة استخدام قد يكون ذلك:

view.setOnClickListener (View.OnClickListener الجديد {

Override

العام باطل عند _ النقر (عرض ت) {

v.setVisibility (View.GONE)؛

}

})؛

جافا 8 منذ البداية، قد تكون مختصرة الطبقات الداخلية مجهول وظيفة الأحادية على النحو التالي:

( اسم متغير) - >  {

تنفيذ العبارة

}

حيث تم حذف اسم الفئة، لأن تعبيرات لامدا يمكن الاستدلال الخاصة. ثم في أمثلة يمكن اختصار لالطريقتين التاليتين:

view.setOnClickListener ((عرض ت) - >  {

v.setVisibility (View.GONE)؛

})؛

view.setOnClickListener ((الخامس) - >  {

v.setVisibility (View.GONE)؛

})؛

يمكن وظيفة أحادي حتى إزالة الأقواس، وأكثر من مسؤول اقتراح استخدام هذه الطريقة:

أسماء المتغيرات - >  {

تنفيذ العبارة

}

حسنا، في على سبيل المثال يمكن اختصارها إلى:

view.setOnClickListener (ت - >  {

v.setVisibility (View.GONE)؛

})؛

عندما عبارة واحدة فقط، رمز يمكن أن يكون لا يزال كتلة قصيرة، والشكل التالي:

( اسم متغير) - >  التعبير

قد يتم حذف اسم الفئة والأقواس لا يزال، على النحو التالي:

أسماء المتغيرات - >  التعبير

حسنا، في أمثلة يمكن زيادة مبسطة إلى:

view.setOnClickListener (ت - >  v.setVisibility (View.GONE))؛

أكثر من 2.3 وظيفة المرجعية الاختزال

وظائف متعددة المعلمة هي وظائف وجود اثنين أو أكثر من المعلمات. على سبيل المثال، المقارنة مقارنة (T O1، T O2) على طريقة واجهة معلمتين، والتي تعرف كما يلي:

FunctionalInterface

الواجهة العمومية المقارنة < تي >  {

الباحث مقارنة (T O1، T O2) .

}

7 والإصدارات السابقة من جاوة، عندما كنا نوع مجموعة، يمكنك إرسال عادة:

قائمة < عدد صحيح >  قائمة = Arrays.asList (1، 2، 3)؛

Collections.sort (القائمة، المقارنة جديدة < عدد صحيح >  {

Override

الباحث العام مقارنة (عدد صحيح O1، صحيح O2) {

العودة O1 كوم باريتو (O2)؛

}

})؛

بدءا جافا 8، قد تكون مختصرة الطبقات الداخلية مجهول وظيفة متعددة المعلمة على النحو التالي:

( 1 اسم المتغير اسم المتغير 2 ) - >  {

تنفيذ العبارة

}

يمكن حذف اسم الفئة نفسه، في يمكن اختصار الأمثلة على النحو التالي:

Collections.sort (القائمة، (صحيح O1، صحيح O2) - >  {

العودة O1 كوم باريتو (O2)؛

})؛

Collections.sort (القائمة، (O1 و O2) - >  {

العودة O1 كوم باريتو (O2)؛

})؛

عندما عبارة واحدة فقط، رمز يمكن أن يكون لا يزال كتلة قصيرة، والشكل التالي:

( 1 اسم المتغير اسم المتغير 2 ) - >  التعبير

في هذه الحالة أيضا يمكن حذف اسم الفئة، ولكن لا يمكن أن يتم حذف الأقواس. إذا كان يحتاج هذا البيان لإرجاع قيمة، ثم غير مطلوب الكلمة العودة إلى الكتابة.

لذلك، في أمثلة يمكن زيادة مبسطة إلى:

Collections.sort (القائمة، (O1 و O2) - >  O1 كوم باريتو (O2))؛

أخيرا، هذا المثال أيضا يمكن أن يختصر مثل هذا:

Collections.sort (القائمة، صحيح :: compareTo)؛

مهلا، ما هو هذا سمة؟ هذا لنا الحديث عن المحتويات التالية: الطريقة المرجعية.

المراجع طريقة

أيضا مراجع الأسلوب نحوي السكر، فإنه يمكن استخدامها لتبسيط التنمية.

عندما نستخدم عبارات لامبدا، إذا "- > التعبير "عن الحق في تنفيذ فقط استدعاء أسلوب من فئة بالفعل، ومن ثم يمكن استبدال عبارات لامبدا" طريقة مرجعية "تستخدم.

ويمكن تقسيم طريقة مرجعية إلى أربع فئات:

  • مرجع طريقة ثابتة.

  • طريقة مرجع كائن.

  • الرجوع أسلوب فئة.

  • إشارة المنشئ.

يتم تعيين الفئات الأربع التالية عليها وفقا لل، على التوالي.

3.1 إشارة أسلوب ثابت

عندما التعبير نريد القيام به هو استدعاء الأسلوب ثابتة من فئة، وقائمة من المعلمات واجهات المعلمة القائمة في وظيفة هذه الطريقة ثابتة مجردة من المراسلات، ويمكن أن نشير إلى أسلوب ثابت من استخدام تنسيق.

إذا تعبيرات لامدا التي تتوافق مع الشكل التالي:

() - >  اسم الفئة. ساكنة اسم الأسلوب ()

نحن يمكن أن يختصر إلى تنسيق يلي:

اسم الفئة :: اسم أسلوب ثابت

علما بأن أساليب ثابتة لا تحتاج الأقواس وراء اسم، لا إضافة معلمات لأن المترجم يمكن الاستدلال على ذلك. دعونا الاستمرار في استخدام المثال إلى وصفها في القسم 2.3.

أولا إنشاء رمز الفئة فائدة على النحو التالي:

تيلس الطبقة العامة {

الباحث ساكنة العام مقارنة (عدد صحيح O1، صحيح O2) {

العودة O1 كوم باريتو (O2)؛

}

}

علما بأن المعلمات مقارنة المعلمات وظيفة ومقارنة اجهة المقارنة هي وظيفة 1-1. ثم تعبيرات لامدا العامة يمكن كتابة:

Collections.sort (القائمة، (O1 و O2) - >  تيلس كوم حلج (O1 و O2))؛

إذا كان المرجع من طريقة المستخدمة، وهذا يمكن أن يختصر على النحو التالي:

Collections.sort (القائمة، تيلس :: مقارنة)؛

الطرق المرجعية 3.2 الكائن

عندما التعبير نريد القيام به هو استدعاء الأسلوب للكائن، وعندما قائمة من المعلمات واجهات المعلمة القائمة في وظيفة هذا الأسلوب المجرد من المراسلات، ويمكننا تنسيق الكائن باستخدام طريقة مرجعية.

إذا تعبيرات لامدا التي تتوافق مع الشكل التالي:

() - >  الكائن اسم الأسلوب إشارة ()

نحن يمكن أن يختصر إلى تنسيق يلي:

الكائن اسم طريقة مرجعية ::

دعونا الاستمرار في استخدام المثال إلى وصفها في القسم 2.3. أولا، إنشاء رمز الفئة على النحو التالي:

MyClass الطبقة العامة {

الباحث العام مقارنة (عدد صحيح O1، صحيح O2) {

العودة O1 كوم باريتو (O2)؛

}

}

عندما نخلق كائن من الدرجة، واستخدام الكائن في لامبدا طريقة التعبير، عموما يمكنك كتابة:

MyClass myClass = MyClass جديد؛

Collections.sort (القائمة، (O1 و O2) - >  myClass كوم حلج (O1 و O2))؛

علما بأن هذه المعلمة هي وظيفة من 1-1، ثم طريقة عن طريق الإشارة، يمكن اختصار هذا:

MyClass myClass = MyClass جديد؛

Collections.sort (القائمة، myClass :: مقارنة)؛

وبالإضافة إلى ذلك، عندما التعبير ونحن نريد لتنفيذ أسلوب الطبقة هو المكان الذي يدعو تعبيرات لامدا، ويمكننا أيضا استخدام الشكل التالي:

هذا :: اسم الأسلوب

على سبيل المثال، أود أن أضيف الأساليب التالية في فئة توجد تعبيرات لامدا:

الباحث الخاص مقارنة (عدد صحيح O1، صحيح O2) {

العودة O1 كوم باريتو (O2)؛

}

عندما تعبيرات لامدا باستخدام هذه الطريقة، وعموما يمكن كتابتها:

Collections.sort (القائمة، (O1 و O2) - >  مقارنة (O1 و O2))؛

إذا كان المرجع من طريقة المستخدمة، وهذا يمكن أن يختصر على النحو التالي:

Collections.sort (قائمة، وهذا :: مقارنة)؛

3.3 أساليب استشهد الطبقة

الطريقة المستخدمة في إشارة إلى الدرجة المقابلة لشكل نوعين من المعلمات يختلف قليلا. إذا تعبيرات لامدا "- > "حق التعبير التي يتعين القيام بها وتسمى" - > عندما أسلوب مثيل من المعلمة الأولى على اليسار "، ويبدأ (أو أية معلمات) إلى قائمة المعلمة المقابلة لمثال على طريقة من المعلمة الثانية، يمكن استخدام هذا الأسلوب.

قد يكون حول بعض الشيء، وإذا كنا امدا التعبيرات التي تتوافق مع الشكل التالي:

(متغير 1 ) - >  1. أمثلة من المتغيرات طريقة ()

لذا يمكن تبسيط رمز لنا في:

المتغير المقابلة لاسم فئة :: مثال على اسم الأسلوب

أو استخدام المثال في القسم 2.3، عندما امدا التعبيرات التي نستخدمها هي هذه:

Collections.sort (القائمة، (O1 و O2) - >  O1 كوم باريتو (O2))؛

بحسب في مثلا، يمكن أن يختصر مثل هذا:

Collections.sort (القائمة، صحيح :: compareTo)؛

منشئ 3.4 إشارة

عندما التعبير عندما نريد القيام به هو خلق كائن جديد، وقائمة المعلمة منشئ هذا الكائن وقائمة من المعلمات في وظيفة واجهات واحد والمراسلات، يمكننا اعتماد شكل "إشارة منشئ".

إذا كان لدينا لامبدا التعبيرات التي تتوافق مع الشكل التالي:

() - >  اسم الفئة الجديدة ()

نحن يمكن أن يختصر إلى تنسيق يلي:

:: اسم فئة جديدة

وفيما يلي مثال لتوضيح ذلك. جافا 8 يدخل واجهة وظيفة، والتي هي وظيفة من واجهة، جزء من قانون على النحو التالي:

FunctionalInterface

واجهة وظيفة عامة < T، R >  {

/ **

* تنطبق هذه الوظيفة ل ال  نظرا حجة.

*

*param ر ال  حجة وظيفة

*Return ال  نتيجة وظيفة

* /

R التطبيق لاي (T ر).

// احذف جزء من شفرة

}

نحن نستخدم هذه الواجهة لتنفيذ وظيفة لإنشاء حجم ArrayList المحدد. عموما، يمكننا تحقيق ذلك:

وظيفة < صحيح، ArrayList >  وظيفة = وظيفة جديدة < صحيح، ArrayList >  {

Override

جمهور ArrayList التطبيق لاي (عدد صحيح ن) {

العودة ArrayList جديد (ن)؛

}

لائحة = وظيفة. التطبيق لاي (10)؛

استخدام تعبيرات لامدا، ونحن عموما يمكن أن يكتب:

وظيفة < صحيح، ArrayList >  وظيفة = ن - >  جديد ArrayList (ن)؛

استخدام نهج "المراجع منشئ"، ونحن يمكن أن يختصر مثل هذا:

وظيفة < صحيح، ArrayList >  وظيفة = ArrayList :: جديدة؛

العرف واجهة وظيفة

من السهل جدا، وتحتاج واجهة وظيفة مخصصة فقط لكتابة واجهة واحدة فقط يمكن أن تكون أساليب مجردة، نموذج التعليمات البرمجية:

FunctionalInterface

الواجهة العمومية MyInterface < تي >  {

وظيفة باطلة (T ر) .

}

في كودFunctionalInterface هو اختياري، ولكن زائد فإن المترجم الشرح تساعدك على التحقق ما إذا كان يتوافق مع واجهة مواصفات واجهة وظيفة. مثل إضافة الشيكات وظيفة تعليقOverride سواء لإعادة كتابة نفس الشيء.

مبدأ

من خلال في المقدمة، نرى تعبيرات لامدا فقط لتبسيط كتابة الطبقات الداخلية مجهول، على ما يبدو ليحل محل في الترجمة كل من تعبيرات لامدا إلى الطبقات الداخلية مجهول على ذلك. ولكن الواقع هو ليس كذلك، ومستوى JVM، وتعبيرات لامدا والطبقات الداخلية مجهول في الواقع هناك فرق واضح.

تحقيق 5.1 الطبقة الداخلية مجهول

مجهول الطبقات الداخلية لا تزال فئة، نحن فقط لا تحتاج إلى تحديد صراحة اسم الفئة، سوف مترجم تلقائيا عن اسم الفئة. هذه المدونة لديه النموذج التالي:

الطبقة العامة LambdaTest {

ساكنة العام باطلة الرئيسية (سلسلة وسائط) {

جديد الموضوع (Runnable الجديد {

Override

المدى باطل العام {

System.out.println ( "مرحبا أيها العالم")؛

}

}) ابدأ.

}

}

وسوف يكون ملفين الفئة بعد تجميع:

LambdaTest.class

LambdaTest $ 1.class

مزيد من التحليل باستخدام javap -c LambdaTest.class LambdaTest.class بايت كود النتائج جزء هي كما يلي:

ساكنة العام باطلة الرئيسي (java.lang.String ).

الرمز:

0: الجديد رقم 2 // الطبقة جافا / انج / الموضوع

3: الحزب الاتحادي الديمقراطي

4: الجديد رقم 3 // الطبقة كوم / المثال / ي التطبيق lication / امدا / LambdaTest $ 1

7: الحزب الاتحادي الديمقراطي

8: invokespecial رقم 4 // الطريقة كوم / المثال / ي التطبيق lication / امدا / LambdaTest $ 1. " < الحرف الأول > ": V

11: invokespecial # 5 // طريقة جافا / انج / الموضوع ". < الحرف الأول > ": (Ljava / انج / Runnable؛) V

14: invokevirtual # 6 // طريقة جافا / انج / Thread.start: V

17: عودة

ويمكن الاطلاع عليه في 4: جديد # 3 هذا الخط يخلق كائن من فئة الداخلية مجهولة.

تحقيق 5.2 تعبيرات لامدا

نحن المقبل سوف في نموذج التعليمات البرمجية تنفيذها باستخدام تعبير لامبدا، على النحو التالي:

الطبقة العامة LambdaTest {

ساكنة العام باطلة الرئيسية (سلسلة وسائط) {

جديد الموضوع (- >  System.out.println ( "مرحبا أيها العالم"))؛ بدء

}

}

عند هذه النقطة مترجم سيتم إنشاء ملف LambdaTest.class، نظرة على نتيجة بتفريغ التي كتبها javap الملف:

ساكنة العام باطلة الرئيسي (java.lang.String ).

الرمز:

0: الجديد رقم 2 // الطبقة جافا / انج / الموضوع

3: الحزب الاتحادي الديمقراطي

4: invokedynamic # 3، 0 // InvokeDynamic # 0: المدى: Ljava / انج / Runnable.

9: invokespecial رقم 4 // طريقة جافا / انج / الموضوع ". < الحرف الأول > ": (Ljava / انج / Runnable؛) V

12: invokevirtual # 5 // طريقة جافا / انج / Thread.start: V

15: عودة

من في النتائج وجدنا أصبح أسلوب خاص يتم تعبئتها الطبقة الرئيسية من تعبيرات لامدا، والتي يحتج بها تعليمات invokedynamic.

لذلك، يمكننا أن نستنتج: تتحقق تعبيرات لامدا من تعليمات invokedynamic، وسوف كتابة تعبيرات لامدا لا تنتج طبقة جديدة.

منذ التعبير امدا لا يخلق طبقة داخلية مجهولة، ثم استخدم هذه الكلمة في تعبيرات لامدا، بل هو نقطة مرجعية خارج الصف.

مزايا وعيوب

المزايا:

  • يمكنك تقليل رمز الكتابة، والحد من خلق الطبقات الداخلية مجهول، وتوفير أثر الذاكرة.

  • واجهات وظائف مجردة لا يجب أن نتذكر ما استخدمته ل.

العيوب:

  • وضوح غير الفقراء، والناس بحاجة إلى أن يكون على دراية قراءة الشفرة من نوع تعبيرات لامدا والمعلمات وظيفة مجردة.

  • التصحيح مريحة.

كيف تتعلم بسرعة لغة برمجة جديدة؟

زهرة الانشوده إلغاء الحد الحساب، ويمكن فتح ثلاثة مستخدمين الائتمان مستقل: لا يمكن استعارة

لماذا المبرمجين يرتدي دائما مثل شبح

"دوران" هو: هل مؤشر بورصة شنغهاي وشنتشن فقط لا يكذب، مرة واحدة تظهر هذه الخصائص ثمانية، مما يدل على تراكم النهائي الرئيسي قد اكتملت، وارتفعت قاب قوسين أو أدنى

بدأ الإنترنت قبل 50 عاما في غرفة 3420

خصائص بافي خلال سوق الأوراق المالية الصيني: في أيدي من الأموال الصغيرة تريد أن تفعل كبيرة، في محاولة "حجم الشكل والسعر الذهاب شراء وبيع ارتفاع خسائر حجم الشكل"

تعزيز مستوى التعاون والتبادلات الصينية اليونانية بشكل شامل وتعزيز قمة البريكس لتحقيق نتائج مثمرة

المعلمين أومي 5 سنوات لبناء الصين درع الرياح، مستوحاة من بوابة المدينة القديمة من المستخدمين: ما يصل الى الصين

أكاديمية الصينية للعلوم نشرت المغتربين على الانترنت غير مناسب تصريحات إقالة

تقاعد الأب بايثون، والد لغة C وافته المنية، مؤسس لغات البرمجة الرئيسية الوضع الراهن التعرض الكبير

A المستثمرين المال في التمهيدي النفط: "فتح بنسبة 40 في المئة، بانخفاض 5 في إجازة،" فهم دقيق تقريبا جميع الأرباح، وتجنب كل سقوط

كسر ستيرلينغ برافو أحمر ومانشستر سيتي 1-1 على مضيفه أتلانتا: دوري ابطال اوروبا