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.

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.