Collectors.summingLong或mapToLong总结长值

时间:2015-02-02 13:15:23

标签: java java-8

我有一个带有值的对象列表,想要汇总所有这些值。在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;
    }
}

我认为mapToLong更直接,但我无法真正激发原因。

编辑:我已经通过将“摘要”更改为“总结龙”来更新问题,这就是为什么某些答案和评论可能看起来有些偏差。

1 个答案:

答案 0 :(得分:4)

我认为使用Collectors.summarizingLong(AnObject::getVal))会比你需要做更多的工作,因为它会计算总和旁边的其他统计数据(平均值,计数,最小值,最大值......)。

如果您只需要sum,请使用更简单,更有效的方法:

long mappedSum = longs.stream().mapToLong(AnObject::getVal).sum();

Collectors.summarizingLong更改为Collectors.summingLong后,很难说哪个选项更有效率。第一个选项有一个额外的步骤(mapToLong),但我不确定会产生多大的差异,因为与第一个选项相比,第二个选项在collect中的工作量更多在sum