DEV Community

FUNDAMENTOS JAVA
FUNDAMENTOS JAVA

Posted on

8.5 Operações de Redução

1 O que são operações de redução?
São operações que processam os elementos do Stream para produzir um único valor final.

Exemplos:

average(), count(), min(), max(), sum().

2 Exemplo de cálculo da média de pontos

double pontuacaoMedia = usuarios.stream()
.mapToInt(Usuario::getPontos)
.average()
.getAsDouble();

mapToInt converte os objetos para int.

average() calcula a média e retorna um OptionalDouble.

3 Encontrando o usuário com maior pontuação

Optional<Usuario> max = usuarios.stream()
.max(Comparator.comparing(Usuario::getPontos));
Usuario maximaPontuacao = max.get();

max() retorna o usuário com maior pontuação, usando um Comparator.

4 Somando os pontos de todos os usuários

int total = usuarios.stream()
.mapToInt(Usuario::getPontos)
.sum();

sum() soma todos os pontos e retorna um inteiro.

5 Entendendo a operação reduce
reduce() é uma operação de redução genérica que pode ser usada para somar, multiplicar ou realizar qualquer outra agregação.

Funcionamento:

Valor inicial: ponto de partida da operação.

Operação binária: define como combinar os valores.

int total = usuarios.stream()
.mapToInt(Usuario::getPontos)
.reduce(0, (a, b) -> a + b);

0: valor inicial.

(a, b) -> a + b: operação de soma.

6 Alternativas ao Lambda
Podemos usar Integer::sum, simplificando a escrita:

int total = usuarios.stream()
.mapToInt(Usuario::getPontos)
.reduce(0, Integer::sum);

7 Exemplo: Multiplicação dos pontos

int multiplicacao = usuarios.stream()
.mapToInt(Usuario::getPontos)
.reduce(1, (a, b) -> a * b);

Aqui, reduce(1, (a, b) -> a * b) multiplica todos os pontos dos usuários.

8 Redução sem mapToInt

int total = usuarios.stream()
.reduce(0, (atual, u) -> atual + u.getPontos(), Integer::sum);

Aqui, reduce soma os pontos diretamente, sem mapToInt.

Esse formato é útil em streams paralelos, onde o terceiro argumento (Integer::sum) combina resultados parciais.

9 Redução e fold
Em outras linguagens, reduce é chamado de fold.

No próximo capítulo, será mostrado como reduções podem ser paralelizadas usando Streams paralelos.

collect() também é uma forma de redução.

Exemplo: Reducao.java

Image of Timescale

📊 Benchmarking Databases for Real-Time Analytics Applications

Benchmarking Timescale, Clickhouse, Postgres, MySQL, MongoDB, and DuckDB for real-time analytics. Introducing RTABench 🚀

Read full post →

Top comments (0)

👋 Kindness is contagious

If you found this post useful, please drop a ❤️ or a friendly comment!

Okay.