[MÚSICA] [MÚSICA] Olá a todos! Então, estamos de volta aqui no nosso hands-on para mostrar pouquinho para você das expressões lambda. Certo? Então, vamos lá, vamos logo criar o nosso projetinho aqui, tenho certeza que todos estão loucos para ver isso funcionando realmente. Então, vamos botar aqui OlaLambda. [SEM ÁUDIO] Vamos começar aqui, então, com o nosso, vou preparar aqui o terreno, vou criar aqui uma classe chamada Produto, que é a classe que a gente vai utilizar aqui no nosso exemplo. Então, o Produto, ele vai ter string nome, ele tem nome, e ele vai ter o valor. Vai ser inteiro, mesmo. Então, eu vou vir aqui, Source, vou criar o construtor dele usando os campos, vou criar também os gets e sets aqui, aqui, selecionar tudo. Então, vamos criar aqui uma classe principal agora que a gente vai estar adicionando uma lista de produtos. Eu vou pedir para ele colocar o método main pra mim. Então, vamos lá. List<Produto> lista lista, posso já importar aqui, new ArrayList<> (); Então, vamos lá: lista.adiciona new Produto. Vamos colocar aqui Tenis, custa aí cenzão, não? Hoje dia o tênis está caro. Vamos aproveitar aqui, vamos colocar aqui Camiseta, custa, sei lá, 80, e eu vou colocar aqui Cinto, custa 50. Então, vamos lá. Para imprimir isso eu posso usar aqui o lista.forEach, então, para cada produto p eu vou chamar Sysout aqui. Aperta pra imprimir ali o p. Ok? Então, já usando o nosso primeiro Lambda. Então, roda aqui, salva tudo. Opa, faltou aqui a classe produto ter vamos gerar toString aqui pra ele. Ok, acho que agora vai ficar pouquinho mais amigável alí. Isso, imprimiu alí meus produtos. Certo? Bom, agora eu quero fazer aquele esquema de abaixar o preço, então, eu vou abaixar o preço de tudo. Então, eu posso fazer aqui também lista forEach para cada produto p, eu vou fazer p.setValor, é o p.getValor. Como é inteiro, o que eu vou fazer é o seguinte: vezes 90 dividido por 100. Então, eu vou rodar aqui agora e eu vou ver que cima desse, aqui, no caso, eu estou dando 10% de desconto, eu vou ver que cima desses produtos aqui eu vou ter valor reduzido. Então, eu rodo alí. Opa, deu pau. Ponto e vírgula inesperado. Então, salvo aqui, roda, então, a gente pode ver que ele deu aqui os 10% de desconto nos produtos. Hoje dia está mais para aumentar do que para dar o desconto, não é? Então, a gente viu aqui, eu vou então, no caso, agora criar método aqui, que vai ser void darDesconto. Ele vai passar aqui a porcentagem, e aí eu vou fazer this.valor é igual a, não precisa nem do this. Vamos deixar mais conciso. Ele vai ser o valor vezes 100 menos porcentagem. O meu darDesconto aqui vai ser já 10%, então, vai ser o valor vezes 90 dividido por 100. Então, eu rodo aqui, vou salvar, vou vir aqui no meu principal e eu posso simplesmente chamar aqui o p.darDesconto. Então, eu salvo e rodo. Opa, o que ele está reclamando? É do ponto e vírgula. Então, roda aqui e ele está dando o desconto. Como a gente viu, quando a única coisa que você precisa é chamar método, a gente pode usar o method reference. Então, aqui, por exemplo, eu posso usar o produto, e aí são dois dois pontos darDesconto. Lembrando que é sem o parêntesis. E aqui baixo, eu posso simplesmente usar a mesma coisa, no caso aqui ele vai chamar o parâmetro. Ele vai passar o produto como parâmetro, então, eu posso substituir essas duas expressões por method references. Então, eu rodo aqui e da mesma forma eu consegui o desconto. Vamos ver mais o que é que eu posso fazer de interessante. Eu posso, imagina que essa lista aqui, eu vou criar aqui agora a minha classe Carrinho, que vai ter dentro dela uma lista de produtos, eu vou até roubar essa lista daqui, eu vou colocar aqui private, e aí, para simplificar, eu já vou receber aqui a lista como parâmetro. Então, eu já vou gerar aqui o construtor, ok. [SEM ÁUDIO] [SEM ÁUDIO] [SEM ÁUDIO] Uma pausa aqui. [RUÍDO] O nariz está coçando aqui. [RUÍDO] Você tenta disfarçar mãs não tem jeito. Voltou. Bom, então, eu tenho aqui, e aí eu vou criar aqui método darDesconto, só que aqui eu quero parametrizar, eu quero colocar aqui a porcentagem, e eu quero colocar aqui uma condição. Essa condição vai ser uma interface que eu vou criar. A ideia é que ela seja uma interface com método só pra eu podar utilizar ela como uma interface funcional. Então eu vou colocar aqui: Condicao, ele está querendo como classe mas eu quero que seja uma interface, e eu vou simplesmente colocar aqui método boolean, incluir, na verdade vai ser uma condição de E, e aí eu quero saber se esse E aqui vai ser incluído ou não. Então, eu passo aqui como parâmetro uma condição, no caso, eu quero uma condição de produto e, eu vou fazer aqui, para cada Produto ali na lista, a cada produto p da lista eu vou verificar se a condição que eu tenho que incluir esse produto, ou não. Então, se for para incluir, eu vou dar o desconto para ele. Então, vou fazer p ponto no caso aqui seria o setValor, p.getValor vezes 100-porcentagem dividido por 100. Porcentagem, falta r. Então, eu fiz aqui a minha classe carrinho, e simplesmente para eu poder imprimir essa lista depois, vou dar vou gerar aqui get. Pronto. Vou salvar, vou aqui tirar isso daqui, vou criar carrinho, Carrinho c igual a new Carrinho e vou passar ali a lista como parâmetro para ele. Aqui ao invés de imprimir aquela lista lá, vou imprimir a lista do Carrinho. .getLista e o forEach ali também. Aqui eu não estou dando mais desconto, ele simplesmente vai imprimir os produtos. Eu vou chamar aquele darDesconto vou dar desconto de 20%, e aí a condição que é uma interface que eu criei, sem ter nada especial, certo? Como aqui ele espera uma condição, uma condição de produto, eu posso dizer que vai ser p, que ele vamos supor que tem que ser maior do que 100. Então, p.getValor é menor do que 100. Então, eu vou salvar, vou executar e a gente poder ver que o cinto e camiseta eles ganham o desconto mas o tênis aqui não. Eu posso, por exemplo, falar: eu quero que p.getNome ele contém, tem de conter a letra a, por exemplo. Nunca vi esse tipo de desconto, produto com a letra a com desconto, mas vai que eu quero fazer essa maluquice aqui. Então, rolando aqui eu posso ver que só a camiseta, que tem a letra a que recebe aquele desconto, então, eu posso passar qualquer condição. Inclusive, eu posso passar até uma referência para o método produto, se ele tiver alguma coisa que retorne a boolean. então, vamos supor, se eu tiver aqui public boolean, caro, então retorna, esse é caro ou não. Return, por exemplo. valor maior que 200. Então, eu posso passar aqui como lambda, produto caro, como referência. Eu posso passar o getNome? Não, porque a minha interface, ela espera receber cara que retorne boolean, e esse aqui não retorna. Ele fala que é incompatível com tipo de retorno boolean. Então, eu colocando ali o caro, eu vou ver que só aquele produto de 300 vai estar recebendo aqui o desconto. Então, espero que com essa aula aqui, a gente tenha conseguido exercitar pouquinho mais na prática, os conceitos que a gente viu aí na parte das expressões lambda. Muito obrigado, e continuem assistindo o nosso curso. [MÚSICA]