Java fornece um novo recurso chamado referência de método em Java 8. A referência de método é usada para referir-se ao método da interface funcional. É uma forma compacta e fácil de expressão lambda. Cada vez que usar a expressão lambda apenas para se referir a um método, você pode substituir sua expressão lambda pela referência de método. Neste tutorial, explicamos detalhadamente o conceito de referência de método.
Tipos de referências de métodos
Existem os seguintes tipos de referências de método em java:
- Referência a um método estático.
- Referência a um método de instância.
- Referência a um construtor.
1) Referência a um método estático
Você pode consultar o método estático definido na classe. A seguir está a sintaxe e o exemplo que descrevem o processo de referência de métodos estáticos em Java.
Sintaxe
ContainingClass::staticMethodName
Exemplo 1
No exemplo a seguir, definimos uma interface funcional e referimos um método estático ao seu método 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(); } }Teste agora
Saída:
bash enquanto loop
Hello, this is static method.
Exemplo 2
No exemplo a seguir, estamos usando a interface funcional predefinida Runnable para fazer referência ao 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(); } }Teste agora
Saída:
Thread is running...
Exemplo 3
Você também pode usar uma interface funcional predefinida para consultar métodos. No exemplo a seguir, estamos usando a interface BiFunction e seu 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); } }Teste agora
Saída:
30
Exemplo 4
Você também pode substituir métodos estáticos referindo métodos. No exemplo a seguir, definimos e sobrecarregamos três 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); } }Teste agora
Saída:
30 30.0 30.0
2) Referência a um método de instância
assim como os métodos estáticos, você também pode consultar métodos de instância. No exemplo a seguir, descrevemos o processo de referência do método de instância.
Sintaxe
containingObject::instanceMethodName
Exemplo 1
No exemplo a seguir, estamos nos referindo a métodos não estáticos. Você pode consultar métodos por objeto de classe e 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(); } }Teste agora
Saída:
Hello, this is non-static method. Hello, this is non-static method.
Exemplo 2
No exemplo a seguir, estamos nos referindo ao método de instância (não estático). A interface executável contém apenas um método abstrato. Então, podemos usá-lo como interface 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(); } }Teste agora
Saída:
Hello, this is instance method
Exemplo 3
No exemplo a seguir, estamos usando a interface BiFunction. É uma interface predefinida e contém um método funcional apply(). Aqui, estamos nos referindo ao método add para aplicar o método.
adicione tudo
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); } }Teste agora
Saída:
30
3) Referência a um Construtor
Você pode referir um construtor usando a palavra-chave new. Aqui, estamos nos referindo ao construtor com a ajuda da interface funcional.
Sintaxe
ClassName::new
Exemplo
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'); } }Teste agora
Saída:
Hello