Dominei recentemente a expressão Lambda que foi introduzida no java 8. Acho que sempre que estou usando uma interface funcional, costumo sempre usar uma expressão Lambda em vez de criar uma classe que implementa a interface funcional.
Isso é considerado uma boa prática? Ou são as situações em que o uso de um Lambda para uma interface funcional não é apropriado?
Respostas:
Há vários critérios que devem fazer você considerar não usar um lambda:
priceIsOver100
.x -> x.price > 100
é tão claro quanto esse nome. Quero dizer que nomes assimisEligibleVoter
substituem uma longa lista de condições.Não exagere. Lembre-se, o software é facilmente alterado. Em caso de dúvida, escreva nos dois sentidos e veja qual é mais fácil de ler.
fonte
Depende. Sempre que você se encontrar usando o mesmo lambda em lugares diferentes, considere implementar uma classe que implemente a interface. Mas se você usasse uma classe interna anônima, caso contrário, acho que um lambda é muito melhor.
fonte
Apoio a resposta de Karl Bielefeldt, mas quero fornecer uma breve adição.
fonte
Acesso a variáveis locais do escopo anexo
A resposta aceita por Karl Bielefeldt está correta. Eu posso adicionar mais uma distinção:
O código lambda aninhado dentro de um método dentro de uma classe pode acessar quaisquer variáveis efetivamente finais encontradas dentro desse método e classe.
Criar uma classe que implemente a interface funcional não fornece acesso direto ao estado do código de chamada.
Para citar o Tutorial Java (ênfase minha):
Portanto, embora haja vantagens em extrair um código longo e nomeá-lo, você deve ponderá-lo contra a simplicidade do acesso direto ao estado do método e da classe anexos.
Vejo:
fonte
Isso pode ser muito difícil, mas para todos os outros pontos excelentes apresentados em outras respostas, eu acrescentaria:
Prefira as referências do método quando possível. Comparar:
versus
Usar uma referência de método poupa a necessidade de nomear os argumentos do lambda, que geralmente são redundantes e / ou levam a nomes preguiçosos como
e
oux
.fonte
Com base na resposta de Matt McHenry, pode haver um relacionamento entre as referências lambda e o método em que o lambda pode ser reescrito como uma série de referências a métodos. Por exemplo:
vs
fonte