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.