Java proporciona una nueva característica llamada referencia de método en Java 8. La referencia de método se utiliza para hacer referencia al método de la interfaz funcional. Es una forma compacta y sencilla de expresión lambda. Cada vez que utilice una expresión lambda simplemente para hacer referencia a un método, puede reemplazar su expresión lambda con una referencia de método. En este tutorial, explicamos en detalle el concepto de referencia del método.
Tipos de referencias de métodos
Existen los siguientes tipos de referencias de métodos en Java:
- Referencia a un método estático.
- Referencia a un método de instancia.
- Referencia a un constructor.
1) Referencia a un método estático
Puede consultar el método estático definido en la clase. A continuación se muestra la sintaxis y el ejemplo que describen el proceso de referencia a un método estático en Java.
estado de git
Sintaxis
ContainingClass::staticMethodName
Ejemplo 1
En el siguiente ejemplo, hemos definido una interfaz funcional y hemos referido un método estático a su método funcional, digamos().
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(); } }Pruébalo ahora
Producción:
Hello, this is static method.
Ejemplo 2
En el siguiente ejemplo, utilizamos la interfaz funcional predefinida Runnable para hacer referencia al método estático.
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(); } }Pruébalo ahora
Producción:
Thread is running...
Ejemplo 3
También puede utilizar una interfaz funcional predefinida para hacer referencia a métodos. En el siguiente ejemplo, utilizamos la interfaz BiFunction y su método 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); } }Pruébalo ahora
Producción:
30
Ejemplo 4
También puede anular métodos estáticos haciendo referencia a métodos. En el siguiente ejemplo, hemos definido y sobrecargado tres métodos add.
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); } }Pruébalo ahora
Producción:
30 30.0 30.0
2) Referencia a un método de instancia
Al igual que los métodos estáticos, también puede hacer referencia a métodos de instancia. En el siguiente ejemplo, describimos el proceso de hacer referencia al método de instancia.
Sintaxis
containingObject::instanceMethodName
Ejemplo 1
En el siguiente ejemplo, nos referimos a métodos no estáticos. Puede hacer referencia a métodos por objeto de clase y objeto anónimo.
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(); } }Pruébalo ahora
Producción:
Hello, this is non-static method. Hello, this is non-static method.
Ejemplo 2
En el siguiente ejemplo, nos referimos al método de instancia (no estático). La interfaz ejecutable contiene solo un método abstracto. Entonces, podemos usarlo como interfaz 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(); } }Pruébalo ahora
Producción:
Hello, this is instance method
Ejemplo 3
En el siguiente ejemplo, utilizamos la interfaz BiFunction. Es una interfaz predefinida y contiene un método funcional apply(). Aquí, nos referimos al método agregar al método aplicar.
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); } }Pruébalo ahora
Producción:
30
3) Referencia a un constructor
Puede recomendar un constructor utilizando la nueva palabra clave. Aquí nos referimos al constructor con la ayuda de una interfaz funcional.
un ejemplo de un sistema operativo de código abierto es
Sintaxis
ClassName::new
Ejemplo
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'); } }Pruébalo ahora
Producción:
Hello