Java oferă o nouă caracteristică numită referință la metodă în Java 8. Referința la metodă este folosită pentru a face referire la metoda de interfață funcțională. Este o formă compactă și ușoară de exprimare lambda. De fiecare dată când utilizați expresia lambda doar pentru a trimite o metodă, puteți înlocui expresia lambda cu referința la metodă. În acest tutorial, explicăm în detaliu conceptul de referință al metodei.
Tipuri de referințe de metodă
Există următoarele tipuri de referințe de metodă în java:
algoritm subțire
- Referire la o metodă statică.
- Referire la o metodă de instanță.
- Referire la un constructor.
1) Referire la o metodă statică
Vă puteți referi la metoda statică definită în clasă. Mai jos este sintaxa și exemplul care descriu procesul de referire a metodei statice în Java.
Sintaxă
ContainingClass::staticMethodName
Exemplul 1
În exemplul următor, am definit o interfață funcțională și am referit o metodă statică la metoda sa funcțională 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(); } }Testează-l acum
Ieșire:
Hello, this is static method.
Exemplul 2
În exemplul următor, folosim interfața funcțională predefinită Runnable pentru a face referire la metoda statică.
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(); } }Testează-l acum
Ieșire:
Thread is running...
Exemplul 3
De asemenea, puteți utiliza interfața funcțională predefinită pentru a face referire la metode. În exemplul următor, folosim interfața BiFunction și folosim metoda ei apply().
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); } }Testează-l acum
Ieșire:
30
Exemplul 4
De asemenea, puteți suprascrie metodele statice prin metode de referință. În exemplul următor, am definit și supraîncărcat trei metode de adăugare.
sql selectează mai multe tabele
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); } }Testează-l acum
Ieșire:
30 30.0 30.0
2) Referire la o metodă de instanță
ca și metodele statice, puteți consulta și metode de instanță. În exemplul următor, descriem procesul de trimitere a metodei instanței.
Sintaxă
containingObject::instanceMethodName
Exemplul 1
În exemplul următor, ne referim la metode non-statice. Puteți referi metode prin obiect de clasă și obiect anonim.
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(); } }Testează-l acum
Ieșire:
Hello, this is non-static method. Hello, this is non-static method.
Exemplul 2
În exemplul următor, ne referim la metoda instanței (non-statică). Interfața rulabilă conține o singură metodă abstractă. Deci, îl putem folosi ca interfață funcțională.
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(); } }Testează-l acum
Ieșire:
Hello, this is instance method
Exemplul 3
În exemplul următor, folosim interfața BiFunction. Este o interfață predefinită și conține o metodă funcțională apply(). Aici, ne referim la metoda de adăugare la metoda de aplicare.
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); } }Testează-l acum
Ieșire:
emoji-uri iPhone pe telefonul Android
30
3) Referire la un Constructor
Puteți trimite un constructor utilizând cuvântul cheie nou. Aici, ne referim la constructor cu ajutorul interfeței funcționale.
Sintaxă
ClassName::new
Exemplu
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'); } }Testează-l acum
Ieșire:
Hello