Sobes.tech
Middle

Para que são utilizados os streams na nova versão do Java?

sobes.tech IA

Resposta da IA

Streams em Java 8+ são utilizados para processamento declarativo de sequências de dados. Permitem realizar operações funcionais sobre coleções (listas, conjuntos), arrays ou outras fontes de dados num estilo de pipeline.

As principais vantagens do uso de streams:

  • Estilo declarativo: Permitem descrever "o que" deve ser feito com os dados, não "como". Isto torna o código mais legível e compreensível.
  • Cálculos preguiçosos: As operações são processadas apenas quando necessário, o que pode melhorar o desempenho, especialmente ao trabalhar com grandes volumes de dados.
  • Processamento paralelo: Os streams podem ser facilmente paralelizados (usando parallelStream()), permitindo usar eficientemente processadores multinúcleo.
  • Redução do código boilerplate: Substituem os ciclos tradicionais e iteradores por construções mais expressivas e compactas.
  • Imutabilidade: Os streams não alteram a fonte de dados original.

Exemplos de operações comuns com streams:

  • Filtragem: filter() - seleção de elementos com base numa condição.
  • Transformação (map): map() - transformação de cada elemento.
  • Ordenação: sorted() - ordenação de elementos.
  • Elementos distintos: distinct() - remoção de duplicados.
  • Agrupamento: collect(Collectors.groupingBy(...)) - agrupamento de elementos por uma característica.
  • Estatísticas/Agrupamentos: count(), sum(), average(), max(), min(), reduce() - operações de agregação.
  • Recolha numa coleção: collect(Collectors.toList()), collect(Collectors.toSet()) - recolha de resultados numa coleção.

Exemplo de uso:

// Filtragem e transformação de uma lista de strings usando streams
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

List<String> filteredNames = names.stream() // Cria um stream a partir da lista
                                   .filter(name -> name.startsWith("A")) // Filtra: mantém apenas nomes que começam com "A"
                                   .map(String::toUpperCase) // Transforma: cada nome para maiúsculas
                                   .collect(Collectors.toList()); // Recolhe o resultado numa nova lista

System.out.println(filteredNames); // Saída: [ALICE]