[英]Java 8 Lambdas - How to Sum and Average from a stream
是否可以对流进行求和,平均和转换为新对象。 我有一个对象
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 ));
然后我想创建一个新的对象(FooB
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());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.