توفر Java ميزة جديدة تسمى مرجع الطريقة في Java 8. يتم استخدام مرجع الطريقة للإشارة إلى طريقة الواجهة الوظيفية. إنه شكل مضغوط وسهل من تعبير لامدا. في كل مرة تستخدم فيها تعبير lambda لإحالة طريقة ما فقط، يمكنك استبدال تعبير lambda الخاص بك بمرجع الطريقة. في هذا البرنامج التعليمي، نشرح المفهوم المرجعي للطريقة بالتفصيل.
أنواع مراجع الطريقة
هناك الأنواع التالية من مراجع الطريقة في Java:
سلسلة قابلة للمقارنة
- الإشارة إلى طريقة ثابتة.
- إشارة إلى طريقة المثيل.
- إشارة إلى منشئ.
1) الإشارة إلى طريقة ثابتة
يمكنك الرجوع إلى الطريقة الثابتة المحددة في الفصل. فيما يلي بناء الجملة والمثال الذي يصف عملية إحالة الطريقة الثابتة في Java.
بناء الجملة
ContainingClass::staticMethodName
مثال 1
في المثال التالي، قمنا بتعريف واجهة وظيفية وإحالة طريقة ثابتة إلى طريقتها الوظيفية say().
interface Sayable{ void say(); } public class MethodReference { public static void saySomething(){ System.out.println('Hello, this is static method.'); } public static void main(String[] args) { // Referring static method Sayable sayable = MethodReference::saySomething; // Calling interface method sayable.say(); } }اختبره الآن
انتاج:
Hello, this is static method.
مثال 2
في المثال التالي، نستخدم واجهة وظيفية محددة مسبقًا قابلة للتشغيل للإشارة إلى الطريقة الثابتة.
public class MethodReference2 { public static void ThreadStatus(){ System.out.println('Thread is running...'); } public static void main(String[] args) { Thread t2=new Thread(MethodReference2::ThreadStatus); t2.start(); } }اختبره الآن
انتاج:
Thread is running...
مثال 3
يمكنك أيضًا استخدام واجهة وظيفية محددة مسبقًا للإشارة إلى الأساليب. في المثال التالي، نستخدم واجهة BiFunction ونستخدم طريقة application() الخاصة بها.
import java.util.function.BiFunction; class Arithmetic{ public static int add(int a, int b){ return a+b; } } public class MethodReference3 { public static void main(String[] args) { BiFunctionadder = Arithmetic::add; int result = adder.apply(10, 20); System.out.println(result); } }اختبره الآن
انتاج:
30
مثال 4
يمكنك أيضًا تجاوز الطرق الثابتة عن طريق إحالة الطرق. في المثال التالي، قمنا بتعريف ثلاث طرق إضافة وتحميلها بشكل زائد.
import java.util.function.BiFunction; class Arithmetic{ public static int add(int a, int b){ return a+b; } public static float add(int a, float b){ return a+b; } public static float add(float a, float b){ return a+b; } } public class MethodReference4 { public static void main(String[] args) { BiFunctionadder1 = Arithmetic::add; BiFunctionadder2 = Arithmetic::add; BiFunctionadder3 = Arithmetic::add; int result1 = adder1.apply(10, 20); float result2 = adder2.apply(10, 20.0f); float result3 = adder3.apply(10.0f, 20.0f); System.out.println(result1); System.out.println(result2); System.out.println(result3); } }اختبره الآن
انتاج:
30 30.0 30.0
2) الإشارة إلى أسلوب المثيل
مثل الأساليب الثابتة، يمكنك الرجوع إلى أساليب المثيل أيضًا. في المثال التالي، نقوم بوصف عملية إحالة طريقة المثيل.
بناء الجملة
containingObject::instanceMethodName
مثال 1
في المثال التالي، نشير إلى الأساليب غير الثابتة. يمكنك الرجوع إلى الأساليب حسب كائن الفئة والكائن المجهول.
interface Sayable{ void say(); } public class InstanceMethodReference { public void saySomething(){ System.out.println('Hello, this is non-static method.'); } public static void main(String[] args) { InstanceMethodReference methodReference = new InstanceMethodReference(); // Creating object // Referring non-static method using reference Sayable sayable = methodReference::saySomething; // Calling interface method sayable.say(); // Referring non-static method using anonymous object Sayable sayable2 = new InstanceMethodReference()::saySomething; // You can use anonymous object also // Calling interface method sayable2.say(); } }اختبره الآن
انتاج:
Hello, this is non-static method. Hello, this is non-static method.
مثال 2
في المثال التالي، نشير إلى طريقة المثيل (غير الثابتة). تحتوي الواجهة القابلة للتشغيل على طريقة مجردة واحدة فقط. لذلك، يمكننا استخدامه كواجهة وظيفية.
public class InstanceMethodReference2 { public void printnMsg(){ System.out.println('Hello, this is instance method'); } public static void main(String[] args) { Thread t2=new Thread(new InstanceMethodReference2()::printnMsg); t2.start(); } }اختبره الآن
انتاج:
بوويرشيل أكبر من أو يساوي
Hello, this is instance method
مثال 3
في المثال التالي، نستخدم واجهة BiFunction. إنها واجهة محددة مسبقًا وتحتوي على طريقة وظيفية لتطبيق (). هنا، نشير إلى إضافة طريقة لتطبيق الطريقة.
import java.util.function.BiFunction; class Arithmetic{ public int add(int a, int b){ return a+b; } } public class InstanceMethodReference3 { public static void main(String[] args) { BiFunctionadder = new Arithmetic()::add; int result = adder.apply(10, 20); System.out.println(result); } }اختبره الآن
انتاج:
30
3) الإشارة إلى منشئ
يمكنك إحالة المنشئ باستخدام الكلمة الأساسية الجديدة. هنا، نشير إلى المنشئ بمساعدة الواجهة الوظيفية.
بناء الجملة
ClassName::new
مثال
interface Messageable{ Message getMessage(String msg); } class Message{ Message(String msg){ System.out.print(msg); } } public class ConstructorReference { public static void main(String[] args) { Messageable hello = Message::new; hello.getMessage('Hello'); } }اختبره الآن
انتاج:
Hello