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.