[MÚSICA] Olá a todos novamente! Meu nome é Eduardo Guerra, estamos no curso Desenvolvimento Ágil com Java Avançado e hoje vamos falar sobre as interfaces funcionais, ou seja, vamos ver como você poderia, por exemplo, criar uma interface para que ela possa ser substituída por uma expressão Lambda. Na verdade, a expressão Lambda não substitui a sua interface, mas que você possa criar implementações anônimas da sua interface através das expressões Lambda. Vamos ver como isso funciona. Então, a gente viu ali que a gente tinha aquela Interface Consumer e a gente conseguia a partir dela criar Lambda então a grande pergunta é: por que eu posso criar Lambda para representar essa Interface Consumer? Que outras interfaces eu posso utilizar? Será que se eu criar uma interface minha eu posso estar utilizando, estar passando, uma expressão Lambda? Atribuir a ela uma variável do tipo da minha interface uma expressão Lambda? Quando que eu posso fazer isso? A resposta é simples: qualquer interface com apenas método abstrato, ele pode ser representado com Lambda. Então se você criar uma interface que só tem método definido lá, ela pode ser uma expressão Lambda. Como texto complementar, a gente tem caso especial que são os métodos [ESTRANGEIRO] de interface, que também apareceram aí no Java 8, mas não vamos falar sobre isso nessa aula. Fica aí como uma leitura complementar para vocês. Recomendo a todos que deem uma olhada lá que também é interessante. Então a princípio qualquer interface que tenha somente método abstrato pode ser uma interface funcional. Essas interfaces agora que elas podem receber as expressões Lambda para representar implementações nessa interface, elas agora são chamadas de interfaces funcionais. Isso vale, por exemplo, vamos supor que você tenha sistema que já tinha uma interface ou método só, ou se você estiver criando software com ela no Java 8, você pode, por exemplo, importando com uma biblioteca ou alguma coisa assim, você já pode estar utilizando as expressões Lambda no lugar dela. Vou até sair pouquinho aqui para a gente poder dar uma olhada. A gente tem algumas interfaces existentes que tem essa característica como por exemplo o Runnable, que a gente passa para Threads, é exemplo de uma interface com método só. Outro também muito famoso seria a interface para tratar eventos de botão que a gente dá o botão Action Listener. Essas interfaces são exemplos de interfaces funcionais. São interfaces já de versões anteriores do Java, mas que por terem método só elas podem ser substituídas pelo Lambda A ideia é que com isso você mesmo pode criar sua interface funcional. Eu vou sair para a gente poder dar uma olhada no código. Imagina que eu crio ali a minha classe Carrinho de Compras, que tem uma lista de itens e aí eu quero dar desconto para conjunto de itens, para ver uma promoção ou alguma coisa assim, então eu digo ali: olha, eu estou definindo aqui uma interface Condição de Produto, é uma interface de motivo genérico, e aí eu estou falando: para cada produto, se eu devo incluir esse produto, eu vou baixar o preço dele, eu vou dar aquele desconto. Então, essa interface Condição tem esse método "deveIncluir" Essa interface, posso ver aqui, não tem nada de especial. É uma interface "normalzinha", como a gente sempre aprendeu a criar. A gente pode ver ali que ele tem o tipo genérico e tem somente aquele método "deveIncluir" que retorna ali boolean. Então, é uma interface normal, a única coisa que ela tem, não diria de diferente mas de peculiar, seria o fato de ela ter somente método. Vou sair novamente para vocês poderem ver o código. Então, por exemplo, dessa forma eu consigo, por ter só método no lugar daquela interface condição, estar passando Lambda. Então eu estou querendo dar desconto de 10% para todos os produtos que o tipo seja "Brinquedo". Ou, eu quero dar desconto para os produtos mais caros, todos aqueles que o preço é maior do que 200. Então eu consigo, no lugar dessa interface condição, que eu utilizo nesse código aqui, de uma forma normal, eu consigo estar passando Lambda ali, de forma que eu consiga, digamos assim, ele vai executar isso daí no lugar daquela Condição. Essa expressão Lambda vai estar fazendo o papel de uma implementação daquela interface. Uma coisa interessante, eu vou vir rapidamente, vou deixar vocês darem uma olhada no código ali. No caso eu estou passando o preço máximo, que seria uma variável, e é uma variável local, então uma coisa interessante é que os Lambdas podem capturar variáveis locais no método que são criados. Essas variáveis, antes do Lambda, pra gente utilizar classe anônima, obrigatoriamente tinham que ser Final. Agora você não precisa colocar explicitamente o modificador Final nela, mas não pode ser uma variável que é modificada dentro do corpo do método onde você tenha esse Lambda. Então acaba que você não precisa mais que ela seja Final, mas praticamente ela tem que ser Final essência. Era isso que eu queria falar sobre as interfaces funcionais, a gente viu que qualquer interface com método só, inclusive as que a gente criar, você pode estar passando expressões Lambda no lugar dela. Então é isso. Espero você na próxima aula. [MÚSICA]