Lambda Expression ou Method Reference? Vamos entender?
- #Java
Este artigo foi baseado no artigo "Lambda ou method reference? entenda a diferença"
da Alura e por mim adaptado.
Este post faz parte do desafio proposto no bootcamp: Potencia Tech - iFood Java Beginners.
Qual a melhor opção? Lambda ou Method Reference?
Vantagens de usar um ou outro?
E em relação à performance?
Vamos tentar responder essas questões referentes ao uso de Lambda e Method Reference.
Uma função nominal tem a seguinte assinatura:
nomeFuncao(parametros){
//corpo;
};
Exemplo:
int adicionarNumeros(int numero1, int numero2) {
return numero1 + numero2;
}
O Java 8 trouxe muitas novas funcionalidades e dentre elas a possibilidade de
podermos usar os recursos de Lambda e Method Reference.
Essas novas funcionalidades nos ajudam a reduzir a quantidade de código a ser escrito
e a fazer reuso de código e simplificação do mesmo.
Vamos a um exemplo de ambos para podermos entender melhor, e depois
vamos fazer algumas consideraçãoes a respeito.
Supondo que tenhamos uma lista de objetos e desejamos imprimí-la no console:
Código puro:
List<String> objetos = Arrays.asList(“bola”, “lanterna”, “caneta”, "faca");
forEach(String objeto : objetos) {
System.out.print(objeto);
}
Como saída obteríamos:
bola lanterna caneta faca
Agora vamos usar Lambda:
objetos.forEach(objeto -> System.out.print(objeto));
O mesmo poderia ser feito usando Method Reference:
objetos.forEach(System.out::print);
Obteríamos a mesma saída que quando feito com código puro.
Comparando Lambda com Method Reference:
Então agora podemos considerar as perguntas feitas no início.
Qual delas é a melhor opção?
A resposta é depende! Depende do caso em que estamos utilizando.
Nem sempre é possível substituir um Lambda por um Method Reference.
Para conseguir fazer uma chamada a um Reference Method é necessário que a invocação
de método da direita receba os mesmos parâmetros da esquerda do lambda,
caso contrário não é possível substituir.
Vantagens de usar Method Reference?
Apesar de não poder substituir o Lambda em todas as ocasiões,uma das
principais vantagem do Reference é em facilitar ainda mais a legibilidade do código, devido ao uso de menos símbolos.
Outra vantagem é a de estender os métodos dos tipos que estão sendo utilizados.
Por exemplo se temos uma classe Pessoa com o método getIdade():
ao instanciar o objeto p poderiamos usar:
p -> p.getIdade();
ou ainda melhor:
Pessoa::getIdade
Performance?
Pensando na questão de performance o lambda faz uma chamada de método a
mais do que o Method Reference para executar o método, e as duas abordagens
resultam em bytecodes diferentes, entretanto para a maioria dos casos essa
diferença não chega a afetar performance.
Somente em sistemas mais críticos onde a performance é essencial, é que
precisa ser levada em consideração.
Desde já:
Obrigado por ler este artigo.
Aceito sugestões para melhorias.
Se gostou, dá um suporte no artigo pra me ajudar.
Deu para entender bem, obrigado!
Muito bom, obrigado!
Excelente Marcelo pelo conteúdo, ajuda muito !
Muito bom conteúdo, me ajudou bastante obrigado.