إنجاز المزيد بموارد أقل: تعبيرات Java 8 Lambda
يمكن أن يؤدي استخدام تعبيرات lambda إلى تسهيل قراءة كود Java وأقوى وأكثر قابلية للقراءة.
أحد الانتقادات الموجهة للغة البرمجة هو عدد التعليمات المكتوبة لأداء معالجة معينة ، وفي بعض الأحيان يتعين عليك كتابة الكثير من التعليمات البرمجية. لقد حلت تعبيرات Lambda هذه المشكلة لحالات قليلة وجعلت Java أقوى وأسهل ، كما كان الحال في C # منذ سنوات.
تعبيرات Lambda جديدة في Java SE 8 ، وهذه هي أبرز الميزات المضافة إلى هذا الإصدار. توفر تعبيرات Lambda طريقة أوضح لتمثيل الأساليب والواجهات التي تستخدم هذه التعبيرات. تعمل تعبيرات Lambda أيضا على تحسين مجموعات كائنات Java من خلال تسهيل تصفح القوائم وتصفية البيانات واستخراجها من المجموعات. تعمل ميزات الأداء على تقوية Java في البيئات متعددة المهام المتوفرة على جميع أجهزة الكمبيوتر الحديثة الجديدة.
يخشى المبرمجون من أن تعبيرات lambda سوف تلوث الطبيعة الشيئية لجافا بمفهوم البرمجة الوظيفية. في الواقع ، هذه هي نفس الانتقادات التي أثرت على لغة C # قبل بضع سنوات ، لكنها أصبحت أفضل من ذي قبل.
LINQ عبارة عن مجموعة من الميزات ، تم تقديمها أيضا في Visual Studio 2008 ، والتي سمحت بإضافة القدرة على إنشاء استعلامات. LINQ مفيد للاستعلام عن قاعدة بيانات SQL ومستندات XML ومجموعة بيانات ADO.Net ومجموعات .Net والملفات والسلاسل وما إلى ذلك. أصبحت تعبيرات
LINQ و lambda شائعة في مجتمع C #. لذلك ، من الممكن أيضا أن يكون هذا هو الحال بالنسبة لمجتمع Java.
الطبقات الداخلية المجهولة في Java< / h2> كانت الطبقات الداخلية المجهولة في Java هي الخطوة الأولى نحو تعبيرات lambda. يمكنك استخدامها عن طريق استدعاء الفئة الداخلية كما هو موضح في المثال التالي:
أحد الانتقادات الموجهة للغة البرمجة هو عدد التعليمات المكتوبة لأداء معالجة معينة ، وفي بعض الأحيان يتعين عليك كتابة الكثير من التعليمات البرمجية. لقد حلت تعبيرات Lambda هذه المشكلة لحالات قليلة وجعلت Java أقوى وأسهل ، كما كان الحال في C # منذ سنوات.
تعبيرات Lambda جديدة في Java SE 8 ، وهذه هي أبرز الميزات المضافة إلى هذا الإصدار. توفر تعبيرات Lambda طريقة أوضح لتمثيل الأساليب والواجهات التي تستخدم هذه التعبيرات. تعمل تعبيرات Lambda أيضا على تحسين مجموعات كائنات Java من خلال تسهيل تصفح القوائم وتصفية البيانات واستخراجها من المجموعات. تعمل ميزات الأداء على تقوية Java في البيئات متعددة المهام المتوفرة على جميع أجهزة الكمبيوتر الحديثة الجديدة.
يخشى المبرمجون من أن تعبيرات lambda سوف تلوث الطبيعة الشيئية لجافا بمفهوم البرمجة الوظيفية. في الواقع ، هذه هي نفس الانتقادات التي أثرت على لغة C # قبل بضع سنوات ، لكنها أصبحت أفضل من ذي قبل.
Lambda وLINQ في C# وتعبيرات VisualBasic.Net
Lambda إلى C# و VB.Net، بشكل أساسي لدعم LINQ (استعلام اللغة المتكامل). تعبيرات Lambda هي وظائف مجهولة يمكنك استخدامها لإنشاء تعبيرات تشبه الشجرة. في C# ، يمكنك إنشاء تعبير lambda عن طريق تحديد معلمات الإدخال في الجانب يسار عامل لامدا = > ، وضع التعبير أو كتلة التعليمات على الجانب الآخر. على سبيل المثال ، التعبير x = > x*x تحدد معلمة باسم x وترجع مربع x. في VB.Net. في هذه الحالة ، يمكنك استخدام وظائف مجهولة لإنشاء lambda.LINQ عبارة عن مجموعة من الميزات ، تم تقديمها أيضا في Visual Studio 2008 ، والتي سمحت بإضافة القدرة على إنشاء استعلامات. LINQ مفيد للاستعلام عن قاعدة بيانات SQL ومستندات XML ومجموعة بيانات ADO.Net ومجموعات .Net والملفات والسلاسل وما إلى ذلك. أصبحت تعبيرات
LINQ و lambda شائعة في مجتمع C #. لذلك ، من الممكن أيضا أن يكون هذا هو الحال بالنسبة لمجتمع Java.
الطبقات الداخلية المجهولة في Java< / h2> كانت الطبقات الداخلية المجهولة في Java هي الخطوة الأولى نحو تعبيرات lambda. يمكنك استخدامها عن طريق استدعاء الفئة الداخلية كما هو موضح في المثال التالي:
JButton button = JButton الجديد ("اختبار") ؛
button.addActionListener(new ActionListener(){
@Override public void actionPerform(ActionEvent e){
System.out.println ("نقرة واحدة");
}
});
< / pre> الطبقة الداخلية أكشن ليستينر< / سبان> يضاف إلى الزر فئة داخلية تحتوي على طريقة الإجراء المنجز () < / الامتداد> فيه. هذا يوفر لنا القليل من التعليمات البرمجية ، ولكن ليس كثيرا.
تسمى الواجهات التي تحدد طريقة واحدة فقط واجهات وظيفية في java 8. غالبا ما تستخدم تعبيرات Lambda مع الواجهات الوظيفية والفئات الداخلية.
بناء جملة تعبير Lambda في Java< / h2>عامل لامدا في Java هو -> < / سبان>. مثل C # ، يرفق Java 8 الوسيطات كما هو موضح في هذا المثال:
(int x) -> x * x
< / pre>أعلنا متغيرا x< / span> من نوع عدد صحيح ونريد إرجاع مربع هذا المتغير x< / span>.
دعنا نفكر في تعبيرات لامدا الثلاثة هذه:
< pre class = "prettyprint lang-java" > (int x ، int y) -> س + ص < ر / >< ب / > () -> 36
(سلسلة s) -> { System.out.println(s); }
< / pre>الآن ضع في اعتبارك المثال ActionListener< / span> السابق مع lambda:
< pre class = "prettyprint lang-java" > JButton button = JButton الجديد ("اختبار") ؛
testButton.addActionListener(e -> System.out.println ("نقرة واحدة") ؛
< / pre>من الواضح أن هذا الرمز أصغر حجما وأكثر قابلية للقراءة. نلاحظ أيضا أن الطبقة الداخلية ActionListener< / span> الوسيطة e.
حزمة java.util.function
نمط java.util.function في Java 8 ويحتوي على خمسة أنواع من الواجهات الوظيفية:
- Presticate: خاصية للكائن الذي تم تمريره كمعلمة.
- المستهلك: إجراء يجب تشغيله مع الكائن الذي تم تمريره كوسيطة.
- Function: يعرض نتيجة واحدة Y: إكس > Y
- Provider: يحتوي على مثيل X
- أحادي العامل: من X-> x
- مشغل ثنائي ل (X، X)-> نمط x< / li>< / ul >< h2 = "محاذاة النص: يسار ؛" يمكن لمجموعات الكائنات > في Java 8
Lambda تحسين استخدام المجموعات في java. مع الإصدارات المختلفة ، تمت إضافة ميزات إلى المجموعات التي تتحد جيدا مع تعبيرات lambda ، مثل forEach< / span> على كلتا الواجهتين المكرر< / الامتداد> و < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >قابل للتكرار< / span >.< / div>
< / div>مثال: < / div>نريد تحديد نمط List الذي يحتوي على قائمة الطلاب وهذا الفصل له سمة عمر الطالب.
List and = Student.createShortList();
< / person>< / pre>< / div>الآن يمكننا تحديد مسند لنتمكن من الاختيار من قائمة< / سبان>.
< pre class = "prettyprint lang-java" > قائمة المسند < الطالب> = و -> et.getAge() >= 20;
< / student>< / pre>أخيرا ، يمكننا القيام بشيء ما باختيارنا:
aClass.doqlqthing (pl ، list) ؛
< / pre> هذا أسرع بكثير من الإصدارات السابقة من Java. إذا كنت تريد القيام بعملية أكثر تعقيدا ، فمن المفيد استخدام forEach():
et.forEach( e -> e.getName() );
< / pre> في الختام ، فإن الميزات المضافة إلى لغة Java لن تضعف مفهومها الموجه للكائنات بأي شكل من الأشكال. ستجعل هذه الميزات اللغة قوية وغنية وأنيقة.
المراجع:
button.addActionListener(new ActionListener(){
@Override public void actionPerform(ActionEvent e){
System.out.println ("نقرة واحدة");
}
});
< / pre> الطبقة الداخلية أكشن ليستينر< / سبان> يضاف إلى الزر فئة داخلية تحتوي على طريقة الإجراء المنجز () < / الامتداد> فيه. هذا يوفر لنا القليل من التعليمات البرمجية ، ولكن ليس كثيرا.
تسمى الواجهات التي تحدد طريقة واحدة فقط واجهات وظيفية في java 8. غالبا ما تستخدم تعبيرات Lambda مع الواجهات الوظيفية والفئات الداخلية.
بناء جملة تعبير Lambda في Java< / h2>عامل لامدا في Java هو -> < / سبان>. مثل C # ، يرفق Java 8 الوسيطات كما هو موضح في هذا المثال:
(int x) -> x * x
< / pre>أعلنا متغيرا x< / span> من نوع عدد صحيح ونريد إرجاع مربع هذا المتغير x< / span>.
دعنا نفكر في تعبيرات لامدا الثلاثة هذه:
< pre class = "prettyprint lang-java" > (int x ، int y) -> س + ص < ر / >< ب / > () -> 36
(سلسلة s) -> { System.out.println(s); }
< / pre>الآن ضع في اعتبارك المثال ActionListener< / span> السابق مع lambda:
< pre class = "prettyprint lang-java" > JButton button = JButton الجديد ("اختبار") ؛
testButton.addActionListener(e -> System.out.println ("نقرة واحدة") ؛
< / pre>من الواضح أن هذا الرمز أصغر حجما وأكثر قابلية للقراءة. نلاحظ أيضا أن الطبقة الداخلية ActionListener< / span> الوسيطة e.
حزمة java.util.function
نمط java.util.function في Java 8 ويحتوي على خمسة أنواع من الواجهات الوظيفية:
- Presticate: خاصية للكائن الذي تم تمريره كمعلمة.
- المستهلك: إجراء يجب تشغيله مع الكائن الذي تم تمريره كوسيطة.
- Function: يعرض نتيجة واحدة Y: إكس > Y
- Provider: يحتوي على مثيل X
- أحادي العامل: من X-> x
- مشغل ثنائي ل (X، X)-> نمط x< / li>< / ul >< h2 = "محاذاة النص: يسار ؛" يمكن لمجموعات الكائنات > في Java 8
< / pre>أعلنا متغيرا x< / span> من نوع عدد صحيح ونريد إرجاع مربع هذا المتغير x< / span>.
دعنا نفكر في تعبيرات لامدا الثلاثة هذه:
< pre class = "prettyprint lang-java" > (int x ، int y) -> س + ص < ر / >< ب / > () -> 36
(سلسلة s) -> { System.out.println(s); }
< / pre>الآن ضع في اعتبارك المثال ActionListener< / span> السابق مع lambda:
< pre class = "prettyprint lang-java" > JButton button = JButton الجديد ("اختبار") ؛
testButton.addActionListener(e -> System.out.println ("نقرة واحدة") ؛
< / pre>من الواضح أن هذا الرمز أصغر حجما وأكثر قابلية للقراءة. نلاحظ أيضا أن الطبقة الداخلية ActionListener< / span> الوسيطة e.
حزمة java.util.function
نمط java.util.function في Java 8 ويحتوي على خمسة أنواع من الواجهات الوظيفية:- Presticate: خاصية للكائن الذي تم تمريره كمعلمة.
- المستهلك: إجراء يجب تشغيله مع الكائن الذي تم تمريره كوسيطة.
- Function: يعرض نتيجة واحدة Y: إكس > Y
- Provider: يحتوي على مثيل X
- أحادي العامل: من X-> x
- مشغل ثنائي ل (X، X)-> نمط x< / li>< / ul >< h2 = "محاذاة النص: يسار ؛" يمكن لمجموعات الكائنات > في Java 8
Lambda تحسين استخدام المجموعات في java. مع الإصدارات المختلفة ، تمت إضافة ميزات إلى المجموعات التي تتحد جيدا مع تعبيرات lambda ، مثل forEach< / span> على كلتا الواجهتين المكرر< / الامتداد> و < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >قابل للتكرار< / span >.< / div>
< / div>
< / div>
مثال: < / div>
نريد تحديد نمط List الذي يحتوي على قائمة الطلاب وهذا الفصل له سمة عمر الطالب.
Listand = Student.createShortList();
< / person>< / pre>< / div>الآن يمكننا تحديد مسند لنتمكن من الاختيار من قائمة< / سبان>.
< pre class = "prettyprint lang-java" > قائمة المسند < الطالب> = و -> et.getAge() >= 20;
< / student>< / pre>أخيرا ، يمكننا القيام بشيء ما باختيارنا:aClass.doqlqthing (pl ، list) ؛
< / pre> هذا أسرع بكثير من الإصدارات السابقة من Java. إذا كنت تريد القيام بعملية أكثر تعقيدا ، فمن المفيد استخدام forEach():et.forEach( e -> e.getName() );
< / pre> في الختام ، فإن الميزات المضافة إلى لغة Java لن تضعف مفهومها الموجه للكائنات بأي شكل من الأشكال. ستجعل هذه الميزات اللغة قوية وغنية وأنيقة.المراجع: