Java Stream Reduce

Java Stream Reduce
A API de fluxo Java abrange inúmeras abordagens compatíveis com paralelização, como redução e operações de terminal. Aqui, exploraremos a operação de redução da interface de fluxo Java, que possui o método Reduce (). O método reduz () é um processo que combina todos os elementos. O método reduz () usa o operador binário para todos os elementos exibidos no fluxo. O primeiro argumento do operador em que o fluxo deve retornar o valor da aplicação mais recente e o segundo argumento deve retornar o elemento que está presente atualmente no fluxo.

Exemplo 1:

A funcionalidade do método Reduce () Reduce () pode ser facilmente demonstrada com o programa Java. A seguir, é apresentada a implementação da operação de redução usando o método ReduD () para obter a string mais longa.

importar java.util.*;
classe StreamReduce1
public static void main (string [] args)

Lista strnames = matrizes.aslist ("string1", "string2", "string3",
"String4", "String5");
Opcional newstr = strnames.fluxo().Reduce ((FirstName, SecondName)->
primeiro nome.comprimento ()> SecondName.comprimento()? primeiro nome segundo nome);
Newstr.ifpresent (sistema.out :: println);

Demos uma interface de lista em que declaramos o objeto "strname" primeiro e depois chamamos as matrizes.método aslist (). As matrizes.O método aslist () insere o elemento String na forma da lista. Em seguida, fornecemos a interface de classe "opcional" porque os resultados da lista podem conter os valores nulos. Definimos o objeto "Newstr" onde o método Reduce () é implantado após a classe Stream () nos "strnames". A expressão lambda é fornecida ao método Reduce () que insere os dois valores de string para obter a string mais longa. Devido à possibilidade de que a lista na qual a redução () seja executada possa estar vazia, a saída do método Reduce () é opcional. Depois disso, usamos a função de impressão para imprimir o resultado do método Reding ().

A corda mais longa após a operação de redução da operação Reduce () é buscada dentro da saída.

Exemplo 2:

O método Reduced () também pode ser empregado com o acumulador Java. O seguinte programa de origem usa o método Reding () com o acumulador para somar os elementos e encontrar sua média.

importar java.util.Matrizes;
importar java.util.Lista;
classe pública streamreduce2
public static void main (string [] args)
Lista < Integer > NumberArray = Matriz.aslist (7, 1, 3, 9, 15);
int Arraysum = 0;
para (int i = 0; i < NumbersArray.size(); i++)
Arraysum += NumberArray.Entendi);

Sistema.fora.println ("média" + Arraysum / NumberArray.tamanho());

Geregamos a lista de valores numéricos do método ASLIST () da classe ASLIST (). A lista é inicializada dentro da variável "NumberArray" da classe List. Em seguida, definimos outra variável que é "AVG" para avaliar a média da lista fornecida. Invocamos o método Reduce () de fluxo dentro da variável "AVG" e definimos a expressão Lambda como um acumulador dentro do método Reduce (). O método reduz () leva a "soma" e o "currValue" como entrada. Os itens do fluxo inteiro são todos armazenados por este acumulador. Depois de obter a soma dos elementos da lista de fluxos, obtemos a média dividindo a soma do elemento pelo comprimento do tamanho da lista inteira.

A média da lista fornecida de elementos é obtida usando o método Reduce () com o acumulador.

Exemplo 3:

O método ReduD () tem uma classe de wrapper diferente na qual Min e Max são um deles. A seguinte implementação do programa visa obter os valores máximos da coleção de elementos fornecidos.

importar java.util.Arraylist;
importar java.util.Matrizes;
importar java.util.Lista;
Classe streamReduce3

Inteiro estático público getMaxValue (lista Twodigits)

Retorne Twodigits.fluxo()
.Reduce (Inteiro :: Max)
.pegar();

public static void main (string [] args)

Lista Twodigits = matrizes.aslist (14, 52, 76, 95, 39, 41);
Sistema.fora.println ("elemento máximo é" + getMaxValue (twodigits));

Construímos a função getMaxValue dentro da classe Java. A função getMaxValue () é fornecida com o objeto de parâmetro “twodigits”. Em seguida, usamos a palavra -chave de retorno na função getMaxValue (). Chamamos o método Reduce () com a palavra -chave de retorno. O método reduz () recebe uma referência de método, o número inteiro :: max.

Depois disso, usamos o método get () após a operação Reduce () do método para obter os resultados esperados. Em seguida, temos um método main () em que o objeto "twodigit" é inicializado com a lista dos elementos inteiros. Além disso, chamamos a função getMaxValue () na linha de impressão do Java e passamos o objeto "twodigit" para gerar o valor máximo para a lista inteira.

A partir da operação máxima predefinida do método ReduD (), obtemos o valor máximo da lista de alguns valores inteiros.

Exemplo 4:

Há outro programa da operação de redução, onde todos os números em um intervalo específico são multiplicados para obter seus produtos usando o método Reduce ().

importar java.util.*;
importar java.util.fluxo.Intstream;
classe StreamReduce4
public static void main (string [] args)

int numproduct = intstream.intervalo (3, 9)
.Reduce ((n1, n2) -> n1 * n2)
.Orelse (-1);
Sistema.fora.println ("Produto:" + Produto);

Criamos a variável "numProduct" que é definida com o método de classe Intstream (). Os valores de intervalo são atribuídos a este método de intervalo (). Também usamos o método reduz () depois de especificar o método range (). O método reduz () é definido com a expressão para calcular o produto do "N1" e "N2" dentro do intervalo no dado, exceto pelo elemento mais à direita. O método println () é então usado para imprimir o produto da faixa de entrada.

O produto de todos os elementos do alcance é realizado usando a técnica de redução.

Exemplo 5:

O método reduz () pega um parâmetro "combinador" que é usado para combinar dois valores. Ele precisa trabalhar com a função do acumulador. Somente os fluxos paralelos podem ser combinados de maneira eficaz, pois o parâmetro combinador combina a saída de todas as sub-streams para fluxos paralelos.

importar java.util.*;
classe streamreduce5
public static void main (string [] args)

String [] arrvalues ​​= "LIVE", "Long", "Life";
Opcional Combinestring = matrizes.Stream (Arrvalues)
.reduzir ((s1, s2)-> s1 + "-" + s2);
if (combinestring.é presente())
Sistema.fora.println (combinestring.pegar());


Temos uma declaração do objeto da matriz de string, "arrvalues" e inicializamos com os três elementos de string. Em seguida, criamos o objeto de classe "Combinestring" opcional para combinar os elementos anteriores da string. O objeto "Combinestring" recebe um método Stream () que cria o fluxo da matriz de string fornecida. Em seguida, aplicamos o método Reduce () no fluxo da matriz de string. O método reduz () combina as cordas "S1" e "S2" com o caráter de hash "-", já que a expressão é definida lá. Depois disso, exibimos os resultados combinados da string empregando a condição IF que valida se a string combinada estiver presente ou não.

Os elementos da matriz de string agora são combinados com o combinador “-” que o método Reduce () como um parâmetro.

Exemplo 6:

Agora, o método reduz () e o mapa são implantados em um objeto para obter a soma dos valores bigdecimal.

importar java.matemática.BigDecimal;
importar java.util.Matrizes;
importar java.matemática.RoundingMode;
importar java.util.Lista;
classe pública StreamReduce6
public static void main (string [] args)
Lista Billlist = Matriz.aslist (
New Bill ("B26", BigDecimal.Valueof (1045), BigDecimal.Valorof (2.5)),
New Bill ("B92", BigDecimal.Valueof (1721), BigDecimal.Valorof (4)),
New Bill ("B13", BigDecimal.Valueof (2993), BigDecimal.Valueof (3.5))
);
BigDecimal Total = Billlist.fluxo().
mapa (dados -> dados.getDiscount ().Multiplique (dados.getamount ())).
Reduza (BigDecimal.Zero, bigdecimal :: add);
Sistema.fora.println (total);


classe Bill
String billno;
BigDecimal Billamount;
BigDecimal BillDiscount;
Bill public (string billno, bigdecimal billamount, bigdecimal billdiscount)
esse.Billno = Billno;
esse.Billamount = Billamount;
esse.BillDiscount = BillDiscount;

public bigdecimal getamount ()
retornar Billamount;

public bigdecimal getDiscount ()
retornar BillDiscount;

Definimos a interface da lista para a classe "Bill", onde o objeto "Billlist" é declarado. A “Billlist” é ainda mais definida com o método aslist (), onde inicializamos os valores BigDecimal para o campo da classe “Bill” usando a nova palavra -chave. O método ValueOf () é implantado para inserir os valores em relação a cada atributo da classe "Bill". Depois disso, criamos o objeto BigDecimal, "Total", onde o método Stream () é usado para criar o fluxo dos elementos "Billlist".

Em seguida, os elementos do fluxo são mapeados através do método map () em que o método multiply () é especificado para obter o produto do método getamount () getter da classe "fatura". O método Reduce () é implantado nos resultados mapeados, onde o valor identificado para BigDecimal é zero e o acumulador é definido, dando ao BigDecimal :: Add Method Reference. Os resultados do objeto "total" é exibido onde a operação do mapa e a operação de redução são realizadas. Por fim, construímos a classe Wrapper "Bill", onde os atributos Billno, Billamount e BillDiscount são declarados.

O programa anterior gera o seguinte valor como total das contas:

Conclusão

O método reduz () nos permite criar um único resultado a partir de uma série de elementos, aplicando continuamente a operação de redução aos itens da série. Usamos o riacho Java.Reduce () Método nos programas de exemplo deste artigo, o que reduz os elementos do fluxo. No entanto, o fluxo.Reduce () O método não é eficaz em operações de redução mutável; portanto, usá -lo com fluxos grandes pode ser um desafio.