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.