Método reduce em Java Streams para Agregação de Dados

O método reduce em Java Streams permite combinar os elementos de um fluxo em um único valor usando uma operação de acumulação. Ele é útil para tarefas como cálculos numéricos e manipulação de coleções.

Cálculo da Soma

Para somar todos os elementos de uma lista de inteiros:

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

public class ExemploReduce {
    public static void main(String[] args) {
        List<Integer> dados = Arrays.asList(1, 2, 3, 4, 5);
        int resultadoSoma = dados.stream().reduce(0, (ac, valor) -> ac + valor);
        System.out.println("Total: " + resultadoSoma); // Saída: Total: 15
    }
}

O valor inicial 0 é usado como acumulador, e a expressão lambda soma cada elemento ao acumulador.

Cálculo do Produto

Para multiplicar todos os elemetnos de uma lista:

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

public class ExemploReduce {
    public static void main(String[] args) {
        List<Integer> dados = Arrays.asList(1, 2, 3, 4, 5);
        int resultadoProduto = dados.stream().reduce(1, (ac, valor) -> ac * valor);
        System.out.println("Produto: " + resultadoProduto); // Saída: Produto: 120
    }
}

Aqui, o valor inicial é 1, e a operação de multiplicação é aplicada recursivamente.

Encontrar o Valor Máximo

Para determinar o maior valor em uma lista sem um valor inicial:

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

public class ExemploReduce {
    public static void main(String[] args) {
        List<Integer> dados = Arrays.asList(1, 2, 3, 4, 5);
        Optional<Integer> maximo = dados.stream().reduce((a, b) -> a > b ? a : b);
        maximo.ifPresent(v -> System.out.println("Máximo: " + v)); // Saída: Máximo: 5
    }
}

O método reduce retorna um Optional porque o stream pode estar vazio, evitando exceções.

Concatenação de Strings

Para unir múltiplas strings em uma única cadeia de caracteres:

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

public class ExemploReduce {
    public static void main(String[] args) {
        List<String> palavras = Arrays.asList("Olá", "Mundo", "Java", "Stream");
        String textoConcatenado = palavras.stream().reduce("", (ac, elemento) -> ac + elemento);
        System.out.println("Resultado: " + textoConcatenado); // Saída: Resultado: OláMundoJavaStream
    }
}

O valor inicial é uma string vazia, e cada elemento é adicionado ao acumulador.

Filtragem e Soma Condicional

Para somar apenas os números pares após aplicar um filtro:

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

public class ExemploReduce {
    public static void main(String[] args) {
        List<Integer> dados = Arrays.asList(1, 2, 3, 4, 5);
        int somaPares = dados.stream()
            .filter(n -> n % 2 == 0)
            .reduce(0, (ac, valor) -> ac + valor);
        System.out.println("Soma dos pares: " + somaPares); // Saída: Soma dos pares: 6
    }
}

O filter retém apenas os números divisíveis por 2, e reduce acumula a soma.

Tags: java streams reduce Lambda aggregation

Publicado em 6-10 05:03 por Thomas