Asignar a una suma continua en Java 8

Toby:

Si tengo una colección:

List<Long> numbers = asList(2, 2, 4, 5);

¿Cómo puedo asignar E / procesar estos para acumular un total acumulado. Para producir algo como:

List<Long> runningTotals = asList(2, 4, 8, 13);

Mejor aún, ¿cómo puedo crear una lista de algo (como una tupla) para que pueda preservar los orignals:

((2 -> 2), (2 -> 4), (4 -> 8), (5 -> 13));
Samuel Philipp:

Modificar : Como Holger señaló en los comentarios usando Stream.reduce()para este propósito no es correcta. Ver Reducción y Reducción mutable o Java 8 Streams - Recoger vs reducir para obtener más información.

Puede utilizar Java Stream.collect()en lugar de generar su lista con sumas:

List<Long> numbers = Arrays.asList(2L, 2L, 4L, 5L);
List<Pair> results = numbers.stream()
        .collect(ArrayList::new, (sums, number) -> {
            if (sums.isEmpty()) {
                sums.add(new Pair(number, number));
            } else {
                sums.add(new Pair(number, number + sums.get(sums.size() - 1).getSum()));
            }
        }, (sums1, sums2) -> {
            if (!sums1.isEmpty()) {
                long sum = sums1.get(sums1.size() - 1).getSum();
                sums2.forEach(p -> p.setSum(p.getSum() + sum));
            }
            sums1.addAll(sums2);
        });

Esto combina todos los números y crea un par para cada número con la adición a la suma anterior. Se utiliza la siguiente Pairclase de ayudante:

public class Pair {
    private long number;
    private long sum;

    public Pair(long number, long sum) {
        this.number = number;
        this.sum = sum;
    }

    public long getNumber() {
        return number;
    }

    public void setSum(long sum) {
        this.sum = sum;
    }

    public long getSum() {
        return sum;
    }
}

Usted puede cambiar fácilmente de que clase de ayuda si desea agregar algo más de información.

El resultado al final es:

[
    Pair{number=2, sum=2}, 
    Pair{number=2, sum=4}, 
    Pair{number=4, sum=8}, 
    Pair{number=5, sum=13}
]

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=167403&siteId=1
Recomendado
Clasificación