Introdução para uso do Stream.reduce()

A API Stream fornece vários recursos e neste tutorial, veremos a operação Stream.reduce() de uso geral além de alguns casos de uso

Wolmir Cezer Garbin por Wolmir Cezer Garbin - - Java - TUTORIAL

Última atualização em: | 18317 Visualizações

Conceito: Identidade, Acumulador e Combinador

Para entender como fazer uso da operação Stream.reduce(), vamos dividir os elementos participantes da operação:

  • Identidade - um elemento que é o valor inicial da operação de redução e o resultado padrão se o fluxo estiver vazio;

  • Acumulador - uma função que aceita dois parâmetros: um resultado parcial da operação de redução e o próximo elemento do fluxo;

  • Combinador - uma função usada para combinar o resultado parcial da operação de redução, quando a redução é paralelizada ou quando há uma incompatibilidade entre os tipos de argumentos do acumulador e os tipos de implementação do acumulador;



Stream.reduce() com Integer

Tendo o conceito de identidade, acumulador e combinador em mente, vamos ao primeiro exemplo de Stream.reduce():

// iniciamos uma lista com números multiplos de 2
List<Integer> numbers = Arrays.asList(2, 4, 6, 8, 10);

// retornar a soma de todos os números da lista
int result = numbers
	.stream()
	.reduce(0, (subtotal, element) -> subtotal + element);

// verificar o resultado
assertEquals(30, result);

Note que neste caso o valor 0 é o valor de identidade, iniciando o valor parcial da função e será o valor final da operação caso os valores para redução seja vazio. Ainda temos o subtotal que é o valor acumulador da redução e o element que é o valor combinador.

Entendido como a função funciona, podemos fazer uso de lambda para fazer a operação, alterando (subtotal, element) -> subtotal + element para Integer::sum, veja.

int result = numbers.stream().reduce(0, Integer::sum);

Stream.reduce() com String

Legal, temos um exemplo somando valores e entendemos como funciona a operação de redução Stream.reduce(). Mas quando temos uma lista de String. Como podemos utilizar a função?

Vamos ver um exemplo onde utilizaremos o reduce para gerar uma String.

List<String> words = Arrays.asList("how", " to", " use", " reduce", " to", " join", " string");
String result = words
		.stream()
		.reduce("", (partialString , element) -> partialString + element);
assertEquals("how to use reduce to join string", result);

Note que não estamos tratando qual a melhor maneira de fazer concatenação de String, apenas exemplificando o uso do Stream.reduce().

Da mesma forma podemos simplificar utilizando String::concat, veja:

String result = words.stream().reduce("", String::concat);

No próximo post vou mostrar mais detalhes sobre o uso de reduce do Stream.

Não esqueca de deixar suas dúvidas nos comentários e compartilhar este post.


Apoiadores

Publique seu post no Receitas de Código

Aguarde, estamos trabalhando para que você possa publicar sua postagem no Receitas de Código!