O que são expressões lambda em Java e que funcionalidades elas oferecem?
sobes.tech IA
Resposta da IA
As expressões lambda em Java são uma sintaxe concisa para criar funções anónimas (métodos sem nome) que podem ser passadas como argumentos ou armazenadas em variáveis. Essencialmente, são interfaces funcionais implementadas "de improviso".
As principais funcionalidades que as expressões lambda oferecem:
-
Simplificação de sintaxe: Reduzem significativamente o código boilerplate ao trabalhar com interfaces funcionais em comparação com classes internas anónimas.
// Antes da lambda: Runnable classicRunnable = new Runnable() { @Override public void run() { System.out.println("Runnable clássico"); } }; // Com lambda: Runnable lambdaRunnable = () -> System.out.println("Runnable lambda"); -
Programação funcional: Permitem escrever código mais funcional, onde as funções são cidadãos de primeira classe e podem ser passadas como dados. Isto é fundamental para trabalhar com a API Stream.
// Filtragem de uma lista usando lambda List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); List<String> filteredNames = names.stream() .filter(name -> name.startsWith("A")) .collect(Collectors.toList()); -
Trabalho com a API Stream: As expressões lambda são a base para a maioria das operações na API Stream (filter, map, forEach, reduce, etc.), proporcionando concisão e execução paralela.
// Transformação e saída de elementos do stream List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); numbers.stream() .map(n -> n * n) // lambda para mapeamento .forEach(System.out::println); // referência ao método (alternativa à lambda) -
Melhoria na legibilidade: Para operações simples, as lambdas tornam o código mais legível e compreensível, focando na operação em si e não na sintaxe da classe anónima.
-
Implementação de interfaces funcionais: Podem ser usadas em qualquer lugar onde se espera uma instância de uma interface funcional (interface com um método abstrato único).
Sintaxe da expressão lambda: (parâmetros) -> { corpo }
Exemplos:
- Sem parâmetros, sem valor de retorno:
() -> System.out.println("Olá") - Com um parâmetro, sem valor de retorno:
name -> System.out.println("Olá, " + name)(pode omitir os parênteses ao redor de um único parâmetro) - Com vários parâmetros, sem valor de retorno:
(x, y) -> System.out.println(x + y) - Com parâmetros, com valor de retorno:
(a, b) -> a + b(se o corpo for uma única expressão, o seu valor é retornado implicitamente) - Com parâmetros, com bloco de código e valor de retorno:
(a, b) -> { int sum = a + b; return sum; }(é necessárioreturnexplícito para blocos de código)