عامل :: (النقطتان الرأسيتان) في Java 8: دليل كامل مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

عامل :: (Double Colon) في Java 8: من المبتدئ إلى المحترف

\n\n

هل سبق لك أن كتبت كودًا في Java 8 ورأيت بنية غريبة مثل System.out::println أو String::length؟ تبدو وكأنها سحر، أليس كذلك؟ في الواقع، هذا ليس سحرًا، بل هو أحد أكثر الأدوات أناقة في Java الحديثة — عامل النقطتان الرأسيتان (المعروف أيضًا باسم double colon operator أو مرجع الطريقة).

\n\n

في هذه المقالة، سنشرح عامل :: من الأساسيات إلى التقنيات المتقدمة. ستتعلم كتابة كود أكثر نظافة وإيجازًا وقابلية للقراءة. هيا بنا!

\n\n

ما هو عامل :: ولماذا هو مطلوب؟

\n\n

تم تقديم عامل :: (double colon) في Java 8 كسكر نحوي لتعبيرات لامدا. إذا كان تعبير لامدا يقوم ببساطة باستدعاء طريقة موجودة، يمكنك استبداله بمرجع طريقة. وهذا يجعل الكود أقصر وأكثر تعبيرًا.

\n\n

قارن بنفسك:

\n\n
// تعبير لامدا\nlist.forEach(s -> System.out.println(s));\n\n// مرجع طريقة (عامل ::)\nlist.forEach(System.out::println);
\n\n

الخيار الثاني ليس فقط أقصر، بل يخبرك فورًا: "لكل عنصر، استدعِ طريقة println من System.out". روعة!

\n\n

أربعة أنواع من مراجع الطرق

\n\n

في Java 8، هناك أربعة أنواع رئيسية من method reference. دعنا نشرح كل نوع مع أمثلة.

\n\n

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

\n\n

الصيغة: ClassName::staticMethodName

\n\n

مثال: حساب عدد الأرقام الزوجية في قائمة.

\n\n
import java.util.Arrays;\nimport java.util.List;\n\npublic class StaticMethodReference {\n    public static boolean isEven(Integer number) {\n        return number % 2 == 0;\n    }\n\n    public static void main(String[] args) {\n        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);\n        \n        // لامدا\n        long countLambda = numbers.stream()\n                .filter(n -> StaticMethodReference.isEven(n))\n                .count();\n        \n        // مرجع طريقة ثابتة\n        long countRef = numbers.stream()\n                .filter(StaticMethodReference::isEven)\n                .count();\n        \n        System.out.println("عدد الأرقام الزوجية: " + countRef); // 3\n    }\n}
\n\n

لاحظ: نحن لا نستدعي طريقة isEven — نحن فقط نمرر مرجعًا إليها. Java نفسها ستضع كل عنصر من القائمة كوسيطة.

\n\n

2. مرجع طريقة مثيل لكائن محدد

\n\n

الصيغة: objectReference::instanceMethodName

\n\n

يُستخدم هذا النوع عندما يكون لديك كائن محدد بالفعل وتريد استدعاء طريقته.

\n\n
import java.util.Arrays;\nimport java.util.List;\n\npublic class InstanceMethodReference {\n    public static void main(String[] args) {\n        List<String> names = Arrays.asList("آنا", "بوريس", "فيكتور");\n        \n        // إنشاء كائن StringBuilder\n        StringBuilder sb = new StringBuilder("الأسماء: ");\n        \n        // لامدا\n        names.forEach(name -> sb.append(name).append(" "));\n        \n        // مرجع طريقة مثيل\n        // (لكن append يُرجع StringBuilder، لذا نستخدم لامدا)\n        // أما بالنسبة لـ System.out.println - فهو مثالي:\n        names.forEach(System.out::println);\n        \n        System.out.println(sb.toString()); // الأسماء: آنا بوريس فيكتور\n    }\n}
\n\n

المثال الكلاسيكي هو System.out::println. System.out هو كائن محدد من نوع PrintStream، و println هي طريقته.

\n\n

3. مرجع طريقة مثيل لكائن عشوائي من نوع معين

\n\n

الصيغة: ClassName::instanceMethodName

\n\n

غالبًا ما يُخلط هذا النوع مع النوع السابق. هنا لا نحدد كائنًا محددًا — بدلاً من ذلك، نقول: "خذ أي كائن من هذه الفئة واستدعِ طريقته".

\n\n


                
                

المدونات

توصيات الكتب