مراجع الأساليب (Method References)
مراجع الأساليب (Method References)
كثيرًا ما يكون تعبير اللامبدا مجرّد غلاف يستدعي أسلوبًا موجودًا مسبقًا. تتيح لك مراجع الأساليب التخلّص من هذا الغلاف كليًّا والإشارة مباشرةً إلى الأسلوب الذي تريد استخدامه، فينتج عن ذلك كود أكثر إيجازًا يُقرأ بصورة شبه طبيعية.
يُعرّف Java أربعة أنواع من مراجع الأساليب. فهم متى يُطبَّق كلّ نوع — ولماذا يقبله المُصرِّف — هو محور هذا الدرس.
1. مرجع الأسلوب الساكن (Static Method Reference)
الصياغة: ClassName::staticMethod
استخدم هذا النوع حين لا يفعل تعبير اللامبدا سوى استدعاء أسلوب ساكن مع تمرير جميع وسائطه.
يرى المُصرِّف أنّ doubleIt تقبل int واحدًا وتُعيد int واحدًا، وهو ما يطابق توقيع Function<Integer, Integer>. هذا التطابق هو كل ما يحتاجه.
2. مرجع أسلوب نسخة على كائن مُحدَّد
الصياغة: instance::instanceMethod
استخدم هذا النوع حين يكون لديك كائن مُعيَّن في النطاق وتعبير اللامبدا يُمرِّر وسائطه إلى أسلوب على ذلك الكائن.
prefix) هنا مثبَّت عند لحظة إنشاء المرجع. يتلقّى تعبير اللامبدا وسيطًا واحدًا ويمرّره إلى prefix.startsWith(arg). الكائن هو المستقبِل، وليس وسيطًا.
3. مرجع أسلوب نسخة على نسخة اعتباطية من نوع ما
الصياغة: ClassName::instanceMethod
هذا هو النوع الأصعب. استخدمه حين يتلقّى تعبير اللامبدا نسخةً من فئة ما ويستدعي عليها أسلوبًا — أي أنّ الوسيط الأول يصبح هو المستقبِل.
حين تكتب String::toUpperCase، يتحقّق المُصرِّف: "هل يأخذ toUpperCase() صفرًا من الوسائط الإضافية ويُعيد String؟" نعم. يُوصَّل عنصر الدفق تلقائيًّا بوصفه المستقبِل.
يعمل هذا أيضًا مع وسائط إضافية. يطابق String::contains النوع BiPredicate<String, CharSequence> لأنّ الوسيط الأول هو المستقبِل والثاني يُمرَّر إلى contains:
4. مرجع الباني (Constructor Reference)
الصياغة: ClassName::new
استخدم هذا النوع حين ينشئ تعبير اللامبدا كائنًا جديدًا ويُعيده. يشيع استخدامه مع دوالّ المصنع ومُجمِّعات الدفق.
ArrayList::new سواء احتجت إلى Supplier<ArrayList<String>> أو Supplier<ArrayList<Integer>> — يستنتج المُصرِّف النوع من السياق.
اختيار النوع المناسب
جدول قرار سريع حين تمتلك تعبير لامبدا وتتساءل هل تستبدله بمرجع أسلوب:
- يستدعي أسلوبًا ساكنًا مع تمرير جميع الوسائط؟ →
Class::staticMethod - يستدعي أسلوبًا على كائن مُلتقَط مُحدَّد؟ →
capturedVar::method - يستدعي أسلوبًا على الوسيط الأول للامبدا نفسه؟ →
ParameterType::method - ينشئ كائنًا جديدًا؟ →
ClassName::new
MyClass::doSomething إلى أسلوب ساكن أو إلى أسلوب نسخة على نسخة اعتباطية — كلاهما يستخدم صياغة متطابقة. يحلّ المُصرِّف الغموض بمطابقة قائمة وسائط الواجهة الوظيفية. إن وُجد كلاهما وطابق كلاهما، تحصل على خطأ تجميع؛ في هذه الحالة أعِد تسمية أحدهما أو استخدم لامبدا صريحة.
الخلاصة
مراجع الأساليب هي اختصار للامبدا التي لا تفعل سوى التفويض إلى أسلوب أو باني موجود مسبقًا. لا تُضيف قدرة جديدة — كل مرجع أسلوب يمكن كتابته كلامبدا — لكنّها تُزيل الكود المُعيادي وتكشف النية. مع التمرين ستتعرّف على النمط فورًا: إن كان جسم اللامبدا استدعاءً وحيدًا لأسلوب يستخدم فقط وسائطه (وربّما كائنًا مُلتقَطًا)، استبدله بمرجع.