0Pricing
Java Academy · درس

مراجع أساليب الكائنات التعسفية

أشر إلى أسلوب كائن دون تحديد الكائن المستقبِل، ويُستخدم ذلك بكثرة مع عمليات Stream

مراجع أساليب الكائنات التعسفية درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

ما مراجع الأساليب ذات المثيل العشوائي؟

يستخدم مرجع أسلوب ذي مثيل عشوائي البنية ClassName::instanceMethod. ويعمل المعامل الأول للواجهة الوظيفية بوصفه الكائن المستقبِل — إذ يصبح كل عنصر هو الكائن الذي يُستدعى الأسلوب عليه.

import java.util.*;
import java.util.stream.*;

List<String> names = List.of("alice","bob","carol");

// String::toUpperCase — receiver is each list element
List<String> upper = names.stream()
    .map(String::toUpperCase)
    .collect(Collectors.toList());
System.out.println(upper); // [ALICE, BOB, CAROL]

كيفية تحديد الكائن المستقبِل

في مرجع الأسلوب ذي المثيل العشوائي Type::method، يصبح المعامل الأول للواجهة الوظيفية هو this (الكائن المستقبِل):

// String::length matches Function<String, Integer>
// Equivalent to: s -> s.length()
Function<String, Integer> len = String::length;
System.out.println(len.apply("Java")); // 4

// String::isEmpty matches Predicate<String>
// Equivalent to: s -> s.isEmpty()
Predicate<String> isEmpty = String::isEmpty;
System.out.println(isEmpty.test(""));   // true

الاستخدام المكثف مع عمليات Stream

تُعد مراجع الأساليب ذات المثيل العشوائي النوع الأكثر شيوعًا في مسارات Stream:

List<String> words = List.of("Hello","","World","","Java");

// filter with String::isEmpty
long empty = words.stream().filter(String::isEmpty).count();
System.out.println(empty); // 2

// map with String::toLowerCase
words.stream()
     .filter(s -> !s.isEmpty())
     .map(String::toLowerCase)
     .forEach(System.out::println);

أسلوب BiFunction مع الأساليب ذات المعاملين

يطابق الأسلوب ذو المعاملين في نوع ما BiFunction<T, U, R>، حيث يكون T هو الكائن المستقبِل وU هو المعامل:

import java.util.function.*;

// String::startsWith → BiPredicate<String, String>
// receiver=first arg, argument=second arg
BiPredicate<String, String> starts = String::startsWith;
System.out.println(starts.test("JavaStream", "Java")); // true
System.out.println(starts.test("Python", "Java"));      // false

Comparator مع المثيل العشوائي

يطابق String::compareTo الواجهة Comparator<String> — إذ يصبح معاملا المقارن الكائن المستقبِل والمعامل:

List<String> words = List.of("banana","apple","cherry");

List<String> sorted = words.stream()
    .sorted(String::compareTo)
    .collect(Collectors.toList());
System.out.println(sorted); // [apple, banana, cherry]

المثيل العشوائي في فئة مخصصة

يعمل هذا مع أساليب المثيلات في أي فئة، وليس مع أنواع JDK فقط:

record Product(String name, double price) {
    boolean isExpensive() { return price > 50; }
    String label() { return name + " ($" + price + ")"; }
}

List<Product> products = List.of(
    new Product("Widget", 9.99),
    new Product("Gadget", 99.99),
    new Product("Donut", 1.50)
);

products.stream()
    .filter(Product::isExpensive)
    .map(Product::label)
    .forEach(System.out::println); // Gadget ($99.99)

الفرق عن المثيل المحدد

الفرق الأساسي:

  • محدد: obj::method — يكون obj دائمًا هو الكائن المستقبِل
  • عشوائي: Type::method — يكون كل عنصر هو الكائن المستقبِل
String fixed = "prefix";
// Specific instance: fixed is always the receiver
Predicate<String> startsFixed = fixed::startsWith; // always checks 'prefix'.startsWith(arg)

// Arbitrary instance: each element is the receiver
Predicate<String> isEmpty = String::isEmpty; // each element.isEmpty()

مراجع الأساليب في Collectors

تتوافق مراجع الأساليب ذات المثيل العشوائي طبيعيًا مع المجمعات:

List<String> items = List.of("  hello "," world ","  java  ");
List<String> trimmed = items.stream()
    .map(String::trim)
    .collect(Collectors.toList());
System.out.println(trimmed); // [hello, world, java]

تسلسل مراجع الأساليب

يمكن تسلسل مراجع الأساليب باستخدام andThen/compose في Function:

Function<String, String> pipeline =
    ((Function<String, String>) String::trim)
        .andThen(String::toUpperCase);

System.out.println(pipeline.apply("  hello world  "));
// HELLO WORLD

مشكلة شائعة: الأساليب المحمّلة بأشكال متعددة

عندما يكون الأسلوب محمّلًا بأشكال متعددة، يجب على المصرّف استنتاج الشكل الذي يطابق الواجهة الوظيفية. وإذا كان الاستنتاج ملتبسًا، يحدث خطأ في التصريف — استخدم lambda لإزالة الالتباس:

// println is overloaded — which one?
// Consumer<String> c = System.out::println; // OK — infers println(String)
// Consumer<Object> c2 = System.out::println; // OK

// But if ambiguous:
// Function<Object,?> fn = System.out::println; // Error — println doesn't return a value

الأداء

تُصرَّف مراجع الأساليب وعبارات lambda إلى الرمز الثانوي نفسه (عبر invokedynamic). ولا يوجد فرق في الأداء — اختر ما يقدّم قراءة أوضح. وتفضّل معظم أدلة الأسلوب مراجع الأساليب عندما تعبّر بوضوح عن المقصود.

تحقق سريع

ماذا يمثّل String::toUpperCase عند استخدامه مع .map()؟

مراجعة: مراجع أساليب المثيل العشوائي

أهم النقاط:

  • البنية: ClassName::instanceMethod — يكون كل عنصر هو الكائن المستقبِل
  • تطابق الواجهات الوظيفية التي يكون فيها الكائن المستقبِل هو المعامل الأول
  • الأكثر شيوعًا في .map() و.filter() و.sorted() و.forEach()
  • الأساليب ذات المعاملين → BiFunction/BiPredicate مع كون العنصر هو الكائن المستقبِل
  • لا يوجد فرق في الأداء مقارنةً بـ lambda — اختر ما يقدّم قراءة أوضح

الأسئلة الشائعة

هل درس «مراجع أساليب الكائنات التعسفية» مجاني؟

نعم — نص درس «مراجع أساليب الكائنات التعسفية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «مراجع أساليب الكائنات التعسفية»؟

أشر إلى أسلوب كائن دون تحديد الكائن المستقبِل، ويُستخدم ذلك بكثرة مع عمليات Stream تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «مراجع أساليب الكائنات التعسفية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مراجع الأساليب الثابتة
  2. مراجع أساليب الكائن في مثيل محدد
  3. مراجع أساليب الكائنات التعسفية
  4. مراجع المنشئات
← العودة إلى Java Academy