是否可以对流进行求和、平均并将其转换为新对象。我有个目标
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()));
有没有更好的方法做到这一点而不必重复这一点。谢谢
在映射到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