Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Collectors.summingLong或mapToLong汇总长值_Java_Java 8 - Fatal编程技术网

Java Collectors.summingLong或mapToLong汇总长值

Java Collectors.summingLong或mapToLong汇总长值,java,java-8,Java,Java 8,我有一个有值的对象列表,我想总结一下所有这些值。在Java8中,实现这一点的首选方法是什么 public static void main(String[] args) { List<AnObject> longs = new ArrayList<AnObject>(); longs.add(new AnObject()); longs.add(new AnObject()); longs.add(new AnObject());

我有一个有值的对象列表,我想总结一下所有这些值。在Java8中,实现这一点的首选方法是什么

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;
    }
}
publicstaticvoidmain(字符串[]args){
List longs=new ArrayList();
添加(新对象());
添加(新对象());
添加(新对象());
long mappedSum=longs.stream().mapToLong(AnObject::getVal.sum();
long collectedSum=longs.stream().collect(Collectors.summingLong(AnObject::getVal));
System.out.println(mappedSum);
系统输出打印项次(汇总金额);
}
私有静态类对象{
私人长val=10;
公共长getVal(){
返回val;
}
}
我认为马普托隆更直截了当,但我真的无法解释为什么


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

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

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

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

收集器.summaringlong
更改为
收集器.summaringlong
后,很难说哪个选项更有效。第一个选项有一个额外的步骤(
mapToLong
),但我不确定这会有多大区别,由于第二个选项在
collect
中比第一个选项在
sum

中使用mapToLong时做的工作更多,因此有一个方法调用更少,我认为
mapToLong
版本更清晰。另一方面,如果您只关心总和,您可以使用
收集器.summingLong(…)
而不是
summaringlong(…)
。@Misha thx,更新问题@softarn你有没有找到一种优雅的方式?我有一个类似的情况,还有一个额外的要求,我需要找到getValue的长度,然后求和。我认为在你需要它之前,它不会计算这个统计数据?事实上不知道,只是听起来很合理。@softarn基于Javadoc,它计算所有内容-
summaringlong。。。返回一个收集器,该收集器将长生成映射函数应用于每个输入元素,并返回结果值的摘要统计信息
。一旦你在你的流上应用了这个收集器,它就会计算所有的统计数据,而不管你以后访问什么方法。流的特点是,看起来像“额外的步骤”只是它最终将执行的整个操作的一部分。所以这其实没什么区别。