6.4 Referenciando métodos de instância



This content originally appeared on DEV Community and was authored by FUNDAMENTOS JAVA

Criando um method reference para um objeto específico:

Se temos um objeto (rodrigo), podemos referenciar um de seus métodos como rodrigo::tornaModerador.
Exemplo:

Usuario rodrigo = new Usuario("Rodrigo Turini", 50);
Runnable bloco = rodrigo::tornaModerador;
bloco.run(); // Equivalente a rodrigo.tornaModerador()

Esse method reference equivale a um lambda:

Runnable bloco2 = () -> rodrigo.tornaModerador();

Diferença entre rodrigo::tornaModerador e Usuario::tornaModerador:

rodrigo::tornaModerador refere-se a um método de um objeto específico (rodrigo), podendo ser inferido como Runnable (pois não recebe parâmetros).
Usuario::tornaModerador refere-se ao método de qualquer objeto do tipo Usuario, e pode ser inferido como Consumer, pois precisa de um argumento (Usuario).

Exemplo:

Consumer<Usuario> consumer = Usuario::tornaModerador;
consumer.accept(rodrigo); // Invoca rodrigo.tornaModerador()

Equivalente ao lambda:

Consumer<Usuario> consumer2 = u -> u.tornaModerador();

Erros ao misturar tipos de referências:

Não é possível atribuir Usuario::tornaModerador a Runnable, pois este não recebe argumentos, enquanto Consumer exige um parâmetro.
Exemplo inválido:

Runnable consumer = Usuario::tornaModerador; // Erro de compilação!

Conclusão:

Method references permitem referenciar métodos de instância de objetos específicos ou de qualquer instância de uma classe.
O compilador infere o tipo da interface funcional correta com base no contexto.


This content originally appeared on DEV Community and was authored by FUNDAMENTOS JAVA