مراجع الأساليب الثابتة
استبدل lambdas التي تستدعي أساليب ثابتة بمراجع من الشكل ClassName::methodName
مراجع الأساليب الثابتة درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
ما مراجع الطرق؟
مرجع الطريقة هو صيغة مختصرة من لامبدا تفوّض التنفيذ إلى طريقة موجودة. عندما تستدعي لامبدا طريقة واحدة فقط، يكون مرجع الطريقة أوضح وأسهل قراءة.
import java.util.*;
import java.util.stream.*;
List<String> names = List.of("Alice", "Bob", "Carol");
// Lambda:
names.forEach(s -> System.out.println(s));
// Equivalent method reference:
names.forEach(System.out::println);صيغة مرجع الطريقة الساكنة
يأخذ مرجع الطريقة الساكنة الشكل ClassName::staticMethodName. ويمكن استخدامه حيثما تتوقع واجهة وظيفية طريقة بالتوقيع نفسه.
import java.util.stream.*;
// Integer.parseInt(String) matches Function<String, Integer>
List<String> strs = List.of("1","2","3","4","5");
List<Integer> nums = strs.stream()
.map(Integer::parseInt) // replaces s -> Integer.parseInt(s)
.collect(Collectors.toList());
System.out.println(nums); // [1, 2, 3, 4, 5]استخدام Math.abs كمرجع طريقة
يمكن الإشارة مباشرةً إلى الطرق الساكنة في الفئات المساعدة مثل Math:
import java.util.*;
import java.util.stream.*;
List<Integer> values = List.of(-3, 5, -1, 8, -4);
List<Integer> abs = values.stream()
.map(Math::abs) // replaces v -> Math.abs(v)
.collect(Collectors.toList());
System.out.println(abs); // [3, 5, 1, 8, 4]مرجع طريقة ساكنة مع Predicate
يمكن للطرق الساكنة التي تطابق قيمة إرجاع منطقية أن تعمل كـ Predicate:
import java.util.stream.*;
// String.isEmpty() is an instance method, but we can use a static helper
// Objects.isNull matches Predicate<Object>
List<String> mixed = Arrays.asList("hello", null, "world", null);
long nullCount = mixed.stream()
.filter(Objects::isNull)
.count();
System.out.println(nullCount); // 2
long nonNull = mixed.stream()
.filter(Objects::nonNull)
.count();
System.out.println(nonNull); // 2مرجع Comparator الساكن
يمكن أيضًا الإشارة إلى الطرق الساكنة التي تطابق Comparator:
import java.util.*;
import java.util.stream.*;
List<String> words = List.of("banana", "apple", "cherry");
// String.CASE_INSENSITIVE_ORDER is a Comparator
List<String> sorted = words.stream()
.sorted(String::compareToIgnoreCase)
.collect(Collectors.toList());
System.out.println(sorted); // [apple, banana, cherry]طريقة مساعدة ساكنة مخصصة
عرّف طريقة مساعدة ساكنة وأشر إليها مباشرةً:
class Validator {
static boolean isPositive(int n) { return n > 0; }
static String toLabel(int n) { return n > 0 ? "POS" : "NEG"; }
}
List<Integer> nums = List.of(-2, 3, -1, 5, 0);
List<Integer> positive = nums.stream()
.filter(Validator::isPositive)
.collect(Collectors.toList());
System.out.println(positive); // [3, 5]
List<String> labels = nums.stream()
.map(Validator::toLabel)
.collect(Collectors.toList());BiFunction مع طريقة ساكنة
يمكن للطرق الساكنة التي تستقبل معاملين أن تطابق BiFunction<T,U,R>:
import java.util.function.*;
// Math.max(int,int) → BiFunction... but needs IntBinaryOperator
java.util.function.IntBinaryOperator maxOp = Math::max;
System.out.println(maxOp.applyAsInt(7, 3)); // 7
// String.format as BiFunction? Only works if signature matches:
// Integer.sum(int,int) → IntBinaryOperator
java.util.function.IntBinaryOperator sum = Integer::sum;
System.out.println(sum.applyAsInt(10, 20)); // 30الفرز باستخدام Comparator.comparing + مرجع ساكن
ادمج Comparator.comparing مع مراجع الطرق للحصول على فرز واضح:
record Person(String name, int age) {}
List<Person> people = List.of(
new Person("Charlie",30), new Person("Alice",25), new Person("Bob",35)
);
people.stream()
.sorted(Comparator.comparing(Person::name))
.forEach(p -> System.out.println(p.name()));
// Alice, Bob, Charlieمتى تستخدم مراجع الطرق الساكنة؟
استخدم مراجع الطرق الساكنة عندما:
- يكون جسم لامبدا استدعاءً واحدًا لطريقة ساكنة
- لا تحتاج إلى تحويل المعاملات
- يطابق توقيع الطريقة الواجهة الوظيفية
إذا كنت تحتاج إلى تحويل المعاملات أو إضافة منطق، فالتزم باستخدام لامبدا.
مقارنة قابلية القراءة
مقارنة مباشرة بين أسلوبي لامبدا ومرجع الطريقة:
// Lambda style
Stream.of("1","2","3").map(s -> Integer.parseInt(s));
Stream.of(1,-2,3).filter(n -> n > 0);
Stream.of(-5,2,-1).map(n -> Math.abs(n));
// Method reference style
Stream.of("1","2","3").map(Integer::parseInt);
Stream.of(1,-2,3).filter(Validator::isPositive);
Stream.of(-5,2,-1).map(Math::abs);مشكلة شائعة: التوقيع الخطأ
لا يعمل مرجع الطريقة إلا إذا طابق توقيعه تمامًا الطريقةَ المجردة في الواجهة الوظيفية. إذا اختلفت أنواع المعاملات أو عددها، فاستخدم غلاف لامبدا بدلًا منه.
// Math.pow(double, double) needs two args — can't use as Function<Double, Double>
// This won't compile:
// Function<Double, Double> square = Math::pow; // ERROR
// Fix with lambda:
Function<Double, Double> square = n -> Math.pow(n, 2);
System.out.println(square.apply(5.0)); // 25.0تحقق سريع
أي مما يلي مرجع طريقة ساكنة صالح ويعمل كـ Predicate<Object>؟
مراجعة: مراجع الطرق الساكنة
أهم النقاط:
- الصيغة: ClassName::staticMethodName
- تحل محل لامبدا التي تفوّض التنفيذ إلى طريقة ساكنة واحدة
- يجب أن يطابق توقيع الطريقة الطريقةَ المجردة في الواجهة الوظيفية
- تعمل مع Predicate وFunction وConsumer وComparator وغيرها
- استخدم لامبدا عند الحاجة إلى تحويل المعاملات أو إضافة منطق
الأسئلة الشائعة
هل درس «مراجع الأساليب الثابتة» مجاني؟
نعم — نص درس «مراجع الأساليب الثابتة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «مراجع الأساليب الثابتة»؟
استبدل lambdas التي تستدعي أساليب ثابتة بمراجع من الشكل ClassName::methodName تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «مراجع الأساليب الثابتة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مراجع الأساليب الثابتة
- مراجع أساليب الكائن في مثيل محدد
- مراجع أساليب الكائنات التعسفية
- مراجع المنشئات