Обновление : Как отметил Хольгер в комментариях, использование Stream.reduce()
для этой цели не является правильным. См. Сокращение и Изменчивое сокращение или Потоки Java 8 - сбор и уменьшение для получения дополнительной информации.
Вместо этого вы можете использовать Java Stream.collect()
для генерации списка с суммами:
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);
});
Это объединяет все числа и создает пару для каждого числа с добавлением к предыдущей сумме. Он использует следующий класс Pair
в качестве помощника:
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;
}
}
Вы можете легко изменить этот вспомогательный класс, если хотите добавить больше информации.
Результат в конце:
[
Pair{number=2, sum=2},
Pair{number=2, sum=4},
Pair{number=4, sum=8},
Pair{number=5, sum=13}
]