Sobes.tech
Middle

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

sobes.tech IA

Resposta da IA

A utilização de streams nas versões mais recentes do Java (a partir do Java 8) deve-se a várias razões relacionadas com eficiência, legibilidade do código e processamento paralelo de dados:

  • Programação funcional: Os streams permitem escrever código de forma mais declarativa, focando no quê fazer com os dados, em vez de como. Isto melhora a legibilidade e a manutenção.
  • Processamento paralelo: Os streams facilitam a paralelização de operações em coleções usando parallelStream(). A JVM gere a divisão dos dados e a junção dos resultados, simplificando o desenvolvimento de aplicações multithread.
  • Eficiência: A avaliação preguiçosa (lazy evaluation) nos streams significa que as operações só são executadas quando necessário, o que reduz os custos. As operações intermédias (map, filter) não são executadas imediatamente até à chamada de uma operação terminal (collect, forEach).
  • Melhor processamento de coleções: Fornecem um conjunto de operações padrão e de alto nível para filtrar, mapear e agregar dados em coleções, o que reduz a quantidade de código repetitivo com loops.
  • Operações imutáveis: Os streams não modificam a coleção original de onde são criados, mantendo os princípios de imutabilidade e facilitando a depuração.
// Exemplo de uso de streams para filtrar e mapear
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

List<String> filteredNames = names.stream() // Criar stream
                                  .filter(name -> name.startsWith("C")) // Filtrar
                                  .map(String::toUpperCase) // Mapear
                                  .collect(Collectors.toList()); // Recolher numa nova lista

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

Streams paralelos:

// Exemplo de processamento paralelo num stream
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

int sum = numbers.parallelStream() // Criar stream paralelo
                   .mapToInt(Integer::intValue) // Converter para IntStream
                   .sum(); // Soma

System.out.println(sum); // Saída: 55 (pode ser calculado mais rapidamente em sistemas multinúcleo)