6.4 Referenciando métodos de instância

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 consumer = Usuario::tornaModerador; consumer.accept(rodrigo); // Invoca rodrigo.tornaModerador() Equivalente ao lambda: Consumer 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.

Mar 15, 2025 - 05:21
 0
6.4 Referenciando métodos de instância

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 consumer = Usuario::tornaModerador;
consumer.accept(rodrigo); // Invoca rodrigo.tornaModerador()

Equivalente ao lambda:

Consumer 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.