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

Coleções Java: Como varrer uma lista passando um contador

Possuo as duas classes:

class Estoque {
    private double quantidadeAtual;

    protected double debitaEstoque(double quantidade){
        this.quantidadeAtual -= quantidade;
        if (quantidadeAtual < 0){
            double quantidadeFaltando = this.quantidadeAtual;
            this.quantidadeAtual = 0.0;
            return quantidadeFaltando; // retorna o valor que ficou faltando
        }
        return 0; // retorna 0 indicando que a quantidade foi toda consumida
    }
}
class GerenciadorEstoque {
    private List<Estoque> estoques;
}

    public debitaEstoque(double quantidade){
        estoques.stream()
            .forEach(e -> { 
                quantidade = e.debitaEstoque(quantidade); 
                //Erro de compilação
            });
    }

Estou ciente que não posso reatribuir quantidade, foi apenas para exemplificar. Existe outra forma de varrer a lista e ir decrementando a quantidade utilizando a API de coleções do JAVA 8?

3 respostas
solução!
estoques.stream().reduce(new Estoque(quantidade), (estoqueAtual,proximoEstoque) -> 
proximoEstoque.debitaEstoque(estoqueAtual.getQuantidade()));

O método reduce serve exatamente para isso :). Para meu exemplo funcionar vc precisar ter um construtor no estoque recebe a quantidade, um método que retorna a quantidade atual e fazer com que seu debitaEstoque retorne uma nova instância de estoque, com o valor alterado.

Ou vc pode esquecer o que eu falei e usar um for normal :). A decisão fica para vc.

Muito obrigado pela ajuda e me ajudou a esclarecer o método reduce! Tentei procurar mais sobre, mas n consegui aplicar bem. Resolvi utilizar um for mesmo, pois o propósito era diminuir o código.

O reduce é um método mais chato mesmo.. não é natural para a maioria de nós fazermos um código de incremento sem manter o estado em uma variável.