当前位置: 首页 > 知识库问答 >
问题:

Java 8 Lambdas-如何对流求和和平均

越风史
2023-03-14

是否可以对流进行求和、平均并将其转换为新对象。我有个目标

    public class Foo {
       private String code;
       private double price;
      ....
    }

现在我想得到这个对象列表的平均值和总和(代码总和价格和代码平均价格)

 foos = Arrays.asList(
            new Foo("MTN" , 200 ),
            new Foo("MTN" , 210 ),
            new Foo("MTN" , 205 ),
            new Foo("OMT" , 300 ),
            new Foo("OMT" , 320 ),
            new Foo("OMT" , 310 ),
            new Foo("AAA" , 650 ),
            new Foo("AAA" , 680 ),
            new Foo("AAA" , 600 ));

然后我想创建一个新对象(页脚

    public class FooB {
       private String code;
       private double total;
       private double average;
       ....
   }

这就是我现在所拥有的,它可以工作,但是我要通过两次流。我想要一个方法,我可以通过一次流来做到这一点。

 Map<String, Double> averagePrices = foos.stream()
            .collect(
                    Collectors.groupingBy(
                   Foo::getCode,Collectors.averagingDouble(Foo::getPrice)));



    Map<String, Double> totalPrices = foos.stream()
            .collect(
                    Collectors.groupingBy(
                            Foo::getCode,
                            Collectors.summingDouble(Foo::getPrice)));


    List<FooB > fooBs = new ArrayList<>();
    averagePrices.forEach((code, averageprice)-> {
        FooB fooB = new FooB (code , totalPrices.get(code)  , averageprice);
        fooBs.add(fooB );
    });

    fooBs.forEach(e -> System.out.println(e.toString()));

有没有更好的方法做到这一点而不必重复这一点。谢谢

共有1个答案

谷善
2023-03-14

在映射到FooB之前,可以使用DoubleSummaryStatistics保存这两个结果:

Map<String, DoubleSummaryStatistics> data = foos.stream()
                .collect(Collectors.groupingBy(Foo::getCode,
                                    Collectors.summarizingDouble(Foo::getPrice)));

List<FooB> fooBs = data.entrySet().stream()
        .map(e -> new FooB(e.getKey(), e.getValue().getSum(), e.getValue().getAverage()))
        .collect(toList());
 类似资料:
  • 问题内容: 作为输入,我有一个带时间的CSV文件,每次都有一串数字。 我想输出按小时平均和总和分组的每小时表格: 到目前为止,我一直在看用字典来完成它,其中小时是一个关键,值是一个计数和总和的列表,然后将总和除以计数就可以得到平均值。我敢肯定,必须有一种更清洁的方法来做到这一点。也许有些图书馆可以使用它。有什么建议? 问题答案: 一个熊猫的解决方案: 印刷品: 另存为csv文件: 这是以下内容:

  • Flink(批处理/流式处理)中是否有方法同时计算字段的平均值和总和?使用聚合方法,我可以计算groupBy结果中字段的和,但如何同时计算平均值呢?下面的示例代码。

  • 问题内容: 我想要与此等同的流: 该代码实际上并未编译,因为无法将0分配给T类型,但是您可以理解。 问题答案: 这是另一种方法: (不过,总的来说,保罗的回答是减少装箱和拆箱。) 至于 一般而言 ,我认为没有比这更方便的方法了。 我们可以做这样的事情: 但是你总会过夏天。也是有问题的,因为它返回了。上面的方法为一个空的映射抛出一个异常,但是一个空的和应该为0。当然,我们也可以传递0:

  • 我有这样的想法: 我怎么能把它写在一个流中呢?收集f.e.

  • 这是我的代码,它根据一个人所做测试的平均分数返回一个分数。 以下是CourseResult类供参考 和2种生成测试分数的方法。历史结果 和编程结果 所以每个人有3个测试分数。如果我使用编程生成分数,结果很好,因为只有3个编程测试,但是如果我使用历史生成分数,结果我也每个人得到3个测试分数,但是我应该把它当作第四个测试根本没有尝试,这意味着0分。我如何让我的定义标记方法得到收集的测试分数的平均值,而

  • 问题内容: 我在查询需要在SUM DISTINCT Rows处苦苦挣扎。一定有办法做到这一点…但我迷路了。 这是我得到的: 这给了我34行,为每个属于userid4的县提供了不同的人口数量,但是我怎么得到PopEstimate2005和EstimatesBase2000的总和? 类似的东西(但这不是合法的查询): 当然,将Zipcodes.CountyID添加到GroupBy的末尾后,我又回到了3