java - Collectors.summingLong 或 mapToLong 汇总长值

标签 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 更直接,但我无法真正说明原因。

编辑:我通过将 summarizeLong 更改为 summingLong 更新了问题,这就是为什么一些答案和评论可能看起来有点不对劲。

最佳答案

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

如果你只需要sum,使用更简单高效的方法:

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

Collectors.summarizingLong 更改为 Collectors.summingLong 后,很难说哪个选项更有效。第一个选项有一个额外的步骤 (mapToLong),但我不确定这会有多大的不同,因为第二个选项在 collect 中比什么做更多的工作第一个选项在 sum 中执行。

关于java - Collectors.summingLong 或 mapToLong 汇总长值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28278593/

相关文章:

java - 写入 Assets 文件夹中的文件时出现错误文件号异常

java.util.concurrent.CompletionStage - 如何处理异常?

Java 8, lambda : replace Anonymous inner class by lambda

java - 如何使用 Java API Streams 执行此类操作?

java - 将 Haskell 函数转换为 java "function"

java - 如何获取两个 Java.time.LocalTime 实例之间的小时数

java - Arrays.parallelSort 与 Collections.sort

java - 在 gradle 中使用 Firebase 数据库

java - 基于文本的 Java 游戏

java - 生成器模式: nested objects created through other builders