我有一个具有值的对象列表,并且想要总结所有这些值。在 Java 8 中执行此操作的首选方法是什么?
public static void main(String[] args) {
List<AnObject> longs = new ArrayList<AnObject>();
longs.add(new AnObject());
longs.add(new AnObject());
longs.add(new AnObject());
long mappedSum = longs.stream().mapToLong(AnObject::getVal).sum();
long collectedSum = longs.stream().collect(Collectors.summingLong(AnObject::getVal));
System.out.println(mappedSum);
System.out.println(collectedSum);
}
private static class AnObject {
private long val = 10;
public long getVal() {
return val;
}
}
Run Code Online (Sandbox Code Playgroud)
我认为 mapToLong 更直接,但我无法真正解释为什么。
编辑:我已经通过从 summingLong 更改为 summingLong 更新了问题,这就是为什么一些答案和评论可能看起来有点不对劲。
我认为使用Collectors.summarizingLong(AnObject::getVal))会做比你需要它做的更多的工作,因为它计算除总和之外的其他统计数据(平均值、计数、最小值、最大值……)。
如果您只需要sum,请使用更简单、更有效的方法:
long mappedSum = longs.stream().mapToLong(AnObject::getVal).sum();
Run Code Online (Sandbox Code Playgroud)
更改为 后Collectors.summarizingLong,Collectors.summingLong很难说哪个选项会更有效。第一个选项有一个额外的步骤 ( mapToLong),但我不确定这会产生多大的差异,因为collect与第一个选项相比,第二个选项在 中做了更多的工作sum。