Java proporciona una nova característica anomenada referència de mètode a Java 8. La referència de mètode s'utilitza per referir el mètode de la interfície funcional. És una forma compacta i fàcil d'expressió lambda. Cada vegada que utilitzeu una expressió lambda només per referir-vos a un mètode, podeu substituir la vostra expressió lambda per una referència de mètode. En aquest tutorial, estem explicant el concepte de referència del mètode amb detall.
cadena java
Tipus de referències de mètodes
Hi ha els següents tipus de referències de mètodes a Java:
- Referència a un mètode estàtic.
- Referència a un mètode d'instància.
- Referència a un constructor.
1) Referència a un mètode estàtic
Podeu fer referència al mètode estàtic definit a la classe. A continuació es mostra la sintaxi i l'exemple que descriuen el procés de referència al mètode estàtic a Java.
Sintaxi
ContainingClass::staticMethodName
Exemple 1
En l'exemple següent, hem definit una interfície funcional i hem referit un mètode estàtic al seu mètode funcional 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(); } }Prova-ho ara
Sortida:
Hello, this is static method.
Exemple 2
En l'exemple següent, estem utilitzant una interfície funcional predefinida Runnable per fer referència al mètode estàtic.
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(); } }Prova-ho ara
Sortida:
Thread is running...
Exemple 3
També podeu utilitzar una interfície funcional predefinida per referir mètodes. A l'exemple següent, estem utilitzant la interfície BiFunction i el mètode 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); } }Prova-ho ara
Sortida:
30
Exemple 4
També podeu substituir mètodes estàtics fent referència a mètodes. A l'exemple següent, hem definit i sobrecarregat tres mètodes d'addició.
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); } }Prova-ho ara
Sortida:
30 30.0 30.0
2) Referència a un Mètode d'instància
com els mètodes estàtics, també podeu fer referència a mètodes d'instància. En l'exemple següent, estem descrivint el procés de referència del mètode d'instància.
Sintaxi
containingObject::instanceMethodName
Exemple 1
En l'exemple següent, ens referim a mètodes no estàtics. Podeu referir mètodes per objecte de classe i objecte anònim.
ordre lexicogràfic
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(); } }Prova-ho ara
Sortida:
Hello, this is non-static method. Hello, this is non-static method.
Exemple 2
En l'exemple següent, ens referim al mètode d'instància (no estàtic). La interfície executable només conté un mètode abstracte. Per tant, podem utilitzar-lo com a interfície funcional.
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(); } }Prova-ho ara
Sortida:
Hello, this is instance method
Exemple 3
En l'exemple següent, estem utilitzant la interfície BiFunction. És una interfície predefinida i conté un mètode funcional apply(). Aquí, ens referim al mètode d'afegir per aplicar el mètode.
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); } }Prova-ho ara
Sortida:
30
3) Referència a un Constructor
Podeu fer referència a un constructor utilitzant la paraula clau new. Aquí, ens referim al constructor amb l'ajuda de la interfície funcional.
Sintaxi
ClassName::new
Exemple
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'); } }Prova-ho ara
Sortida:
Hello