Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Calculando mínimo, máximo e volume com lambdas (Java 8)

Para montar o CandleStickFactory, o instrutor o fez assim, calculando três valores diferentes em um mesmo for, reaproveitando o loop.

for(Negociacao negociacao : negociacoes) {

      volume.add(negociacao.getVolume());

      if (negociacao.getPreco().compareTo(minimo) < 0) {
        minimo = negociacao.getPreco();
      }
      else if (negociacao.getPreco().compareTo(maximo) > 0) {
        maximo = negociacao.getPreco();
      }
    }

Para praticar o Java 8 e lambdas, fiz a seguinte implementação, que deu o mesmo resultado:

    volume =
      negociacoes.stream()
        .map(Negociacao::getVolume)
        .reduce(BigDecimal.ZERO, BigDecimal::add);

    minimo =
      negociacoes.stream()
      .min(Comparator.comparing(Negociacao::getPreco)).get().getPreco();

    maximo =
      negociacoes.stream()
      .max(Comparator.comparing(Negociacao::getPreco)).get().getPreco();

Quando o rodei o JUnit, vi que a implementação com for foi mais rápida, pois fez os três cálculos com apenas uma repetição. Já o stream rodou a repetição por três vezes.

Gostaria de saber, portanto, se existe uma forma de unificar os três cálculos com apenas uma repetição, utilizando lambdas.

1 resposta
solução

Acho que você pode reaproveitar o stream... mas mesmo assim você ainda vai passar por todos os elementos... não vejo uma forma de fazer do mesmo jeito.. a única maneira seria fazendo um .forEach, mas no fim ficaria um código igual ao outro...