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.
Top comments (0)