Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Condicional dentro do reduce?

Olá a todos. Eu estava fazendo a redução de uma list para BigDecimal utilizando o seguinte código

 BigDecimal receita = lds.stream().filter( l -> 
       l.getContaContabil().matches("^6212//d.+" &&
  l.getNaturezaReceita().matches("^74//d.+") )
        .map(LivroDiario :: getValor).reduce(BigDecimal.ZERO,BigDecimal::add);

Mas aqui há um problema, pois na classe LivroDiario tenho um atributo que diz se a operação é um crédito (C) ou Débito (D). Então não basta somar eu precisaria fazer algo do tipo dentro do reduce:

BigDecimal saldo =  BigDecimal.ZERO;

for(LivroDiario ld :lds){
if(ld.getTipoMovimento.equals("C"){

saldo = saldo.add(ld.getValor());
}else{
saldo = saldo.subtract(ld.getValor());
}
}

Como posso utilizar essa condicional dentro de uma operação de redução?

2 respostas
solução!

Fala ai Ricardo, de boa ?

Cara o que você pode fazer é usar um lambda ali e não usar o reduce, por exemplo.

Até consegui fazer, mas coloquei um ternário no map()

public class Teste {

    public static void main(String[] args) {


        LivroDiario ld1 = new LivroDiario("1", "1","1", new BigDecimal("100"), "C", 17);
        LivroDiario ld2 = new LivroDiario("1", "1","1", new BigDecimal("400"), "C", 17);
        LivroDiario ld3 = new LivroDiario("1", "1","1", new BigDecimal("200"), "D", 17);
        List<LivroDiario> lds =  Arrays.asList(ld1,ld2,ld3);

         BigDecimal sum = lds.stream()
                 .map(ld -> (ld.getTipoLancamento().equals("C")) ? ld.getValor() : ld.getValor().negate())
                 .reduce(BigDecimal.ZERO,BigDecimal::add);            



    lds.stream().filter(ld -> ld.getTipoLancamento().equals("D")).forEach(LivroDiario::inverteSinal);
  BigDecimal sum2 = lds.stream().map(ld -> ld.getValor()).reduce(BigDecimal.ZERO,BigDecimal::add);    

    System.out.println("sum: "+sum);
    System.out.println("sum2: "+sum2);


    }

}