[MÚSICA] Olá a todos,
meu nome é Eduardo Guerra,
estamos aqui no Curso de Desenvolvimento Ágil com Java Avançado.
Estamos aqui uma última parte de lambda e vamos falar sobre referências de método.
A gente vai aprender como que a gente passa referências
diretas de método no lugar de expressões lambda.
Então, às vezes, a única coisa que a gente tem que fazer é a invocação de método.
Então, a gente vai ali fazer às vezes uma expressão lambda e fala assim: "Para cada
produto, chame o método aumentarPreço".
Às vezes é fácil, é igua mais igual a dois.
A única coisa que tenho que fazer na minha expressão lambda é a invocação de método,
que às vezes encapsula uma certa lógica que eu tenho.
Nesses casos eu posso usar o "Method Reference".
A referência de método é uma forma de dizer "para
cada produto você vai chamar na classe 'produto' o método 'aumentar preço'".
Então o "Method Reference" tem esta estrutura que eu coloco
ali o nome da classe, o delimitador,
que são dois "dois pontos" e o nome do método sem parenteses.
É uma forma de eu estar referenciando o nome do método.
E passando ele no lugar de uma expressão Lambda.
Então, da mesma forma que posso passar o "Method Reference"
no lugar de uma interface funcional, eu posso também atribuir "Method
Reference" a uma varíavel do tipo de interface funcional.
Então, eu posso, por exemplo criar o "Consumer<Produto>" e atribuir o "Produto:
aumentarPreco", essa referência de método, no lugar do "Consumer".
Então, na verdade, não é método,
para quem conhece a API de reflexão, que a gente vai ver nas próximas aulas,
o "Method Reference" não é uma referência direta ao método, não é a classe "Method".
Na verdade, ele é uma sintaxe que tempo de compilação vai ser
transformada naquela implementação da interface funcional,
que a única coisa que vai fazer vai ser a invocação daquele método.
Eu também consigo usar métodos estáticos, no caso, por exemplo,
do "aumentarPreco", ele era método da classe produto,
ou seja da classe que o método da interface funcional "Consumer" recebe
como parâmetro, então, o "aumentarPreco" era método sem parâmetro.
Se eu tenho método estático, como o "System.out::println",
eu posso ter nesse caso, ele não é método da classe "produto", mas,
aquele produto passado como parâmetro, vai ser passado como parâmetro para ele.
A gente vê que existe uma certa
inteligência ali como que ele faz esse casamento entre o
retorno e os parâmetros da interface funcional.
Então, por exemplo, se eu pegar e colocar ali o
"runnable" que é uma interface funcional,
que tem o método "run", que retorna "void", não tem parâmetro e eu passo ali
"Produto::getPreco" e fala assim: "espere aí, você está me passando aqui método,
mas eu vou invocar esse método quem?" Porque o "runnable",
o método "run" não recebe ninguém como parâmetro então eu não tenho
produto para invocar o método "getPreco".
Por outro lado, eu posso usar o "Method Reference" diretamente uma instância.
Eu posso, por exemplo,
criar uma instância de produto, por exemplo, chamo a variável de "P",
e aí eu coloco o "Method Reference" a partir do objeto e não a partir da classe.
Nesse caso, eu posso atribuir para o "runnable",
porque ele vai invocar aquele método na instância "P".
Então, nesse caso,
ele diz qual a instância que aquele método vai estar sendo invocado.
Nesse caso funciona.
Eu não vou aqui fazer todo detalhamento sobre isso aí,
mas é importante que tenha encaixe do "Method Reference".
Por exemplo, método, uma interface funcional,
ela pode ter método, por exemplo, que receba dois parâmetros.
E aí, se eu passo "Method Reference" que recebe aqueles
mesmos dois tipos de parâmetro, ele aceita.
Se a minha interface funcional, se ela recebe dois parâmetros e aí,
por exemplo, eu passo o método de uma classe
que é a classe do primeiro parâmetro e esse método recebe parâmetro,
ele consegue fazer esse encaixe entre o que eu estou passando e o que
a interface funcional espera, então tem que haver esse encaixe que
o método que você está passando e a assinatura ali da interface funcional.
Havendo este casamento, o "Method Reference" vai funcionar.
Então, é isso.
Espero que vocês tenham entendido como usar essas referências de método
no lugar das expressões lambda, que é uma forma as vezes até pouco mais concisa,
mais legível de você estar referenciando.
Muito obrigado e até a próxima aula.
[MÚSICA]