Streams Api

Streams

Introdução à Streams API em Java 8

A Streams API é uma das características mais poderosas introduzidas no Java 8. Ela permite que os desenvolvedores realizem operações de processamento de dados de forma mais concisa e eficiente, trazendo uma abordagem funcional para lidar com coleções de elementos.

O que são Streams em Java?

Em Java, uma stream é uma sequência de elementos que suporta operações de processamento de dados. Ao contrário das coleções tradicionais, as streams não armazenam dados, elas permitem que você execute operações em uma sequência de elementos de forma eficiente.

As streams permitem que você realize operações como filtrar, mapear, ordenar e reduzir coleções de dados de forma declarativa, o que torna o código mais legível e fácil de manter.

Por que usar Streams?

As streams oferecem várias vantagens:

  • Concisão: As operações em streams podem ser expressas de forma mais concisa e legível do que os loops tradicionais.
  • Paralelismo: As streams facilitam a execução de operações em paralelo, aproveitando automaticamente o poder de processamento multicore dos sistemas.
  • Composição: Você pode encadear várias operações em uma única linha de código, tornando mais fácil compor comportamentos complexos.
  • Imutabilidade: As operações em streams não modificam os dados originais, o que promove uma programação mais funcional e evita efeitos colaterais inesperados.

Exemplo

Aqui está um exemplo simples de como usar streams em Java:

import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> palavras = Arrays.asList("ola", "mundo", "java", "stream");

        palavras.stream()
               .filter(p -> p.length() > 4)
               .forEach(System.out::println);
    }
}

Neste exemplo, estamos filtrando somente palavras com mais de 4 letras gerando o seguinte resultado.

mundo
stream

Um exemplo mais elaborado antes de nos aprofundarmos em cada item

List<Integer> numeros = Arrays.asList(1, 2, 3, 4, 5);

// Filtrar números pares e depois dobrar cada um
List<Integer> resultado = numeros.stream()
                                .filter(n -> n % 2 == 0)
                                .map(n -> n * 2)
                                .collect(Collectors.toList());

System.out.println(resultado); // Saída: [4, 8]

Aqui, numeros.stream() cria um stream a partir da lista numeros. Em seguida, filter e map são operações intermediárias que definem a lógica para filtrar os números pares e dobrá-los. Por fim, collect é uma operação que coleta os resultados em uma lista.

Na sequência, vamos explorar alguns dos conceitos fundamentais das streams, como expressões lambda, operações de forEach, map, filter, allMatch, reduce, entre outros.