我有一个 PricingSamples 对象数组:
public class PricingSample {
private Date time;
private Double average;
public PricingSample(Date time, Double average) {
this.time = time;
this.average = average;
}
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
public Double getAverage() {
return average;
}
public void setAverage(Double average) {
this.average = average;
}
}
样本是过去一个月的每小时一次。我想计算每天的总体平均值。我能够计算流中出现的次数,也能够计算每天所有平均值的总和,我只是不知道如何将这些合并到一个流中。
这是我得到的。
对每一天的所有平均值求和(我按 Date 属性的子字符串分组,因此它按天分组,即 Thu Apr 26):
Map<String, Double> counts = Arrays.stream(samples).collect(Collectors.groupingBy((PricingSample e) -> {
return e.getTime().toString().substring(0, 10);
},
Collectors.summingDouble((PricingSample e) -> {
return e.getAverage();
})));
获取每天的样本数: map 计数 =
Arrays.stream(samples).collect(Collectors.groupingBy((PricingSample e) -> {
return e.getTime().toString().substring(0, 10);
},
Collectors.counting()
));
最佳答案
如果你想要平均值,使用averagingDouble
。这样您就不需要计算样本的总和和数量。
Map<String, Double> averages =
Arrays.stream(samples)
.collect(Collectors.groupingBy(e -> e.getTime().toString().substring(0, 10),
Collectors.averagingDouble(PricingSample::getAverage)));
如果您希望按键(天)对 Map
进行排序,您可以强制输出为 TreeMap
:
Map<String, Double> averages =
Arrays.stream(samples)
.collect(Collectors.groupingBy(e -> e.getTime().toString().substring(0, 10),
TreeMap::new,
Collectors.averagingDouble(PricingSample::getAverage)));
关于java - 在Java中使用流分组并计算对象数组的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50619213/