映射到Java 8中的运行总和 [英] Map to a running sum in Java 8
问题描述
如果我有一个集合:
List<Long> numbers = asList(2, 2, 4, 5);
如何映射/处理这些以构建运行总计。产生类似的东西:
How can I map/process these to build up a running total. To produce something like:
List<Long> runningTotals = asList(2, 4, 8, 13);
更好的是,我如何建立一个东西的列表(如元组),这样我就可以保留orignals:
Even better, how can I build a list of something (like a tuple) so I can preserve the orignals:
((2 -> 2), (2 -> 4), (4 -> 8), (5 -> 13));
推荐答案
更新:作为Holger使用 Stream.reduce()
为此目的不正确。请参阅减少和可变减少或 Java 8 Streams - collect vs reduce 以获取更多信息。
Update: As Holger pointed out in the comments using Stream.reduce()
for this purpose is not correct. See Reduction and Mutable Reduction or Java 8 Streams - collect vs reduce for more information.
您可以使用Java Stream.collect()
而不是生成你的清单总和:
You can use Java Stream.collect()
instead to generate your list with sums:
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
类作为帮助程序:
This combines all the numbers and creates a pair for each number with the addition to the previous sum. It uses the following Pair
class as helper:
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;
}
}
如果您愿意,可以轻松更改助手类添加更多信息。
You can easily change that helper class if you want to add some more information.
最后的结果是:
[
Pair{number=2, sum=2},
Pair{number=2, sum=4},
Pair{number=4, sum=8},
Pair{number=5, sum=13}
]
这篇关于映射到Java 8中的运行总和的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!