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
Última atualização em: | 19078 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 osubtotal
que é o valor acumulador da redução e oelement
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.