لن أكتب جزء بناء الجملة ، دعنا فقط نطرح سؤالًا عمليًا لمعرفة وسائل الراحة التي يمكن أن تجلبها لنا هذه الميزات الجديدة لـ Java8.
بالمناسبة ، يتم استخدام بعض البرمجة العامة ، كل شيء هو تبسيط الكود
مشهد:
فئة بيانات تسجل معلومات الموظف
موظف الطبقة العامة {اسم السلسلة العامة ؛ العصر العام العام ؛ الجنس الشار العام ؛ وقت السلسلة العام ؛ راتب الباحث العام ؛}لدينا عمود من هذا النوع من البيانات
قائمة <evelope> data = arrays.aslist (e1 ، e2 ، e3 ......)
هناك حاجة الآن: موظفي المجموعة من خلال الرسالة الأولية لأسمائهم (على افتراض أنهم جميعهم أسماء إنجليزية):
ثم يجب أن تكون النتيجة التي نريد الحصول عليها علاقة رسم خرائط مثل Map:char -> List<Employee>
الخريطة الثابتة العامة <الحرف ، قائمة <evelope>> groupbyfirstchar (قائمة <efference> البيانات) {map <حرف ، قائمة <evelope>> result = new hashmap <> () ؛ لـ (الموظف e: data) {حرف c = e.name.charat (0) ؛ قائمة <evelope> l = result.get (c) ؛ if (l == null) {l = new ArrayList <> () ؛ النتيجة. } l.add (e) ؛ } نتيجة الإرجاع ؛}الكود غير معقد ويمكن إكماله قريبًا. يرى الرئيس أنك فعال للغاية ، لذلك قال إنك ستقسمه إلى مجموعات وفقًا لراتبك ، لأولئك الذين تقل أعمارهم عن 5000 ، 5000 ~ 10،000 ... إلخ.
لن يكون الأمر صعبًا للغاية ، فقط قم بتغيير المفتاح ومعالجته بشكل منطقي قليلاً
الخريطة الثابتة العامة <string ، قائمة <evelope>> groupbysalary (قائمة <efferene> البيانات) {map <string ، list <experiede>> result = new hashmap <> () ؛ لـ (الموظف e: data) {string key = منفصل (eSalary) ؛ قائمة <evelope> l = result.get (مفتاح) ؛ if (l == null) {l = new ArrayList <> () ؛ النتيجة. } l.add (e) ؛ } نتيجة الإرجاع ؛ <br>} سلسلة ثابتة خاصة منفصلة (راتب int) {if (الراتب <= 5000) {return "أقل من 5000" ؛ } if (الراتب <= 10000) {return "5000 ~ 10000" ؛ } if (الراتب <= 20000) {return "10000 ~ 20000" ؛ } العودة "فوق 20000"}ثم قال الرئيس مرة أخرى ، دعنا نقسم الموظفين إلى مجموعات وفقًا لسنة عملهم. . .
لن أكتب الرمز هنا. إذا قارنتها ، فستجد أنه بغض النظر عن كيفية تجميعها ، فإن التغيير الوحيد هو الطريقة لتحديد قيمة المفتاح.
يتم استخدام الحرف الأول من اسم الموظف كمفتاح لأول مرة:
الموظف e -> e.name.charat (0)
المرة الثانية التي أقوم فيها بتحويل راتب الموظف إلى سلسلة كمفتاح وفقًا للطريقة الانفصال:
الموظف E -> منفصل (E.Salary): سلسلة
وهلم جرا
الموظف E -> getyear (E.Time): سلسلة
في الواقع ، في المرة الأولى التي يمكنك فيها كتابة الحرف الأول إلى طريقة واحدة.
الموظف e -> getFirstchar (e.name): شخصية
من أجل أن تبدو أكثر جمالا ، يمكننا القول أن معلمات الأساليب الثلاثة يتم تعيينها على الموظف. لا تتم كتابة طريقة الجسم. يتم سرد فقط المعلمات وقيم الإرجاع هنا.
الموظف e -> getFirstchar (e): earlemployee e -> منفصل (e): stringMployee e -> getyear (e): String
الجانب الأيسر من -> هو المعلمة ، والجانب الأيمن من: هو قيمة الإرجاع ، والجانب الأيمن من -> هو توقيع الطريقة
بعد ذلك ، سوف نفكر بشكل طبيعي في استخراج الجزء الذي تم تغييره كمعلمات وأجزاء أخرى لم تتغير كهيئات طريقة ، حتى نتمكن من حذف الكود المكرر. من الواضح أن الجزء الذي تم تغييره هو الطريقة المذكورة أعلاه ، والتي تحول الموظف إلى مفتاح ، لكننا نعلم أن Java لا يمكنها تمرير طرق كمعلمات. ومع ذلك ، فإن هذه ليست مشكلة للمبرمجين مع القليل من الخبرة. يمكننا استخدام واجهات لتحقيق أهدافنا ، وفي الوقت نفسه سوف نواجه مشكلة أخرى. تختلف قيم الإرجاع للطرق الثلاث المذكورة أعلاه ، لذلك نحتاج إلى استخدام الأدوية الجيلية:
static static <k> map <k ، list <forkeee>> GroupByKey (قائمة <evelope> البيانات ، getKey <k> getKey) {map <k ، list <emexamee>> result = new hashmap <> () ؛ لـ (الموظف e: data) {k key = getKey.getKey (e) ؛ قائمة <evelope> l = result.get (مفتاح) ؛ if (l == null) {l = new ArrayList <> () ؛ النتيجة. } l.add (e) ؛ } نتيجة الإرجاع ؛} واجهة getKey <k> {k getKey (الموظف e) ؛}ثم يمكن تحقيق المطلب الأول أعلاه بهذه الطريقة
خريطة <حرف ، قائمة <evelope>> result = groupByKey (البيانات ، getKey جديد <farter> () {Override public character getKey (effectee e) {e.name.charat (0) ؛}}) ؛الشرط الثاني
خريطة <string ، list <experiede>> result = groupbykey (قائمة ، getKey جديد <string> () {Override public string getKey (exempleee e) {seply (e.salary) ؛}}) ؛يمكن العثور على أننا نحتاج فقط إلى تغيير المعلمات العامة وتنفيذ فئات داخلية مجهولة المصدر. المشكلة الوحيدة هي أنها ليست واقعية للغاية ، والعديد من الرموز الروتينية تنعكس بشكل خاص في الطبقات الداخلية المجهولة.
في الواقع ، نحن نهتم فقط بالمعلمات وقيم إرجاع هذه الفئة الداخلية المجهولة ، والباقي مجرد متطلبات بناء الجملة.
Java8 يحدث فقط لتزويدنا بطريقة جيدة لتجنب إجراءات معقدة: تعبيرات Lambda ، يمكن كتابة التنفيذ أعلاه باسم
خريطة <حرف ، قائمة <evelope >> resultByFirstchar = groupByKey (قائمة ، e ->
تعرض تعبيرات Lambda فقط ما نهتم به ، والمعلمات وإرجاع القيم. في الوقت نفسه ، بسبب نوع الاستدلال ، يمكن حذف أنواع المعلمات. لن يتم تقديم بناء الجملة المحدد هنا. يمكن العثور على الكثير من المعلومات على الإنترنت
إضافي:
إذا كان لديك فهم جيد للذهل الأولي ، يمكن استخلاص طريقة GroupBykey:
static public <k ، e> map <k ، list <e >> groupby (list <؟ extends e> data ، function <؟ super e ،؟ k> fun) {map <k ، list <e> result = new hashmap <> () ؛ لـ (e e: data) {k k = fun.apply (e) ؛ <br> list <e> l = result.get (k) ؛ if (l == null) {l = new ArrayList <> () ؛ النتيجة. } l.add (e) ؛ } نتيجة الإرجاع ؛ <br>}لقد استخرجنا أيضًا فئة الموظف ، والفوائد واضحة
واجهة الوظيفة هي واجهة تمت إضافتها حديثًا إلى Java8:
functionalInterFacepublic Interface Function <T ، r> {r Apply (t t) ؛}أدخل نوع t للعودة إلى نوع r. مزيج من الأدوية الجيلية والبرمجة الوظيفية جيدة جدا. على الرغم من أن الميزات الجديدة لـ Java8 قد انتقدت من قبل أنواع مختلفة من الشكاوى ، إلا أنه من الجيد دائمًا تحقيق الفوائد ، مما يمنحنا المزيد من الخيارات.
إذا كان لديك وقت ، سأقدم دفقًا ، أداة رائعة أخرى لـ Java8
ما سبق هو تطبيق تعبيرات Lambda في Java 8 وبعض المعرفة ذات الصلة العامة التي قدمها لك المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!