Riferimenti al metodo Java

Riferimenti al metodo Java

Java fornisce una nuova funzionalità chiamata riferimento al metodo in Java 8. Il riferimento al metodo viene utilizzato per fare riferimento al metodo dell'interfaccia funzionale. È una forma compatta e semplice di espressione lambda. Ogni volta che utilizzi l'espressione lambda solo per fare riferimento a un metodo, puoi sostituire l'espressione lambda con il riferimento al metodo. In questo tutorial spiegheremo in dettaglio il concetto di riferimento del metodo.


Tipi di metodi di riferimento

Esistono i seguenti tipi di riferimenti ai metodi in Java:

  1. Riferimento ad un metodo statico.
  2. Riferimento a un metodo di istanza.
  3. Riferimento a un costruttore.
Tipi di riferimenti ai metodi Java

1) Riferimento ad un metodo statico

È possibile fare riferimento al metodo statico definito nella classe. Di seguito è riportata la sintassi e l'esempio che descrivono il processo di riferimento al metodo statico in Java.

Sintassi

 ContainingClass::staticMethodName  

Esempio 1

Nell'esempio seguente, abbiamo definito un'interfaccia funzionale e riferito un metodo statico al suo metodo funzionale 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(); } }  
Provalo adesso

Produzione:

 Hello, this is static method.  

Esempio 2

Nell'esempio seguente utilizziamo l'interfaccia funzionale predefinita Runnable per fare riferimento al metodo statico.

 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(); } }  
Provalo adesso

Produzione:

 Thread is running...  

Esempio 3

È inoltre possibile utilizzare l'interfaccia funzionale predefinita per fare riferimento ai metodi. Nell'esempio seguente, utilizziamo l'interfaccia BiFunction e il suo metodo 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); } }  
Provalo adesso

Produzione:

 30  

Esempio 4

È inoltre possibile sovrascrivere i metodi statici facendo riferimento ai metodi. Nell'esempio seguente abbiamo definito e sovraccaricato tre metodi di aggiunta.

 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); } }  
Provalo adesso

Produzione:

 30 30.0 30.0  

2) Riferimento ad un metodo di istanza

come i metodi statici, puoi anche fare riferimento ai metodi di istanza. Nell'esempio seguente descriviamo il processo di riferimento al metodo di istanza.

Sintassi

 containingObject::instanceMethodName  

Esempio 1

Nell'esempio seguente ci riferiamo a metodi non statici. È possibile fare riferimento ai metodi per oggetto classe e oggetto anonimo.

 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(); } }  
Provalo adesso

Produzione:

 Hello, this is non-static method. Hello, this is non-static method.  

Esempio 2

Nell'esempio seguente ci riferiamo al metodo di istanza (non statico). L'interfaccia eseguibile contiene solo un metodo astratto. Quindi, possiamo usarlo come interfaccia funzionale.

 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(); } }  
Provalo adesso

Produzione:

 Hello, this is instance method  

Esempio 3

Nell'esempio seguente, stiamo utilizzando l'interfaccia BiFunction. È un'interfaccia predefinita e contiene un metodo funzionale apply(). Qui ci riferiamo al metodo Aggiungi per applicare il metodo.

 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); } }  
Provalo adesso

Produzione:

 30  

3) Riferimento ad un Costruttore

Puoi fare riferimento a un costruttore utilizzando la nuova parola chiave. Qui ci riferiamo al costruttore con l'aiuto dell'interfaccia funzionale.

Sintassi

 ClassName::new  

Esempio

 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'); } }  
Provalo adesso

Produzione:

 Hello