使用Java8流API查找嵌套类的多个属性的平均值
我想用这个公式计算一年内每周的平均心率。Java8StreamsAPI已经投入使用,但我无法找到最好的方法。我当前的实现并不是那么有效,因为它是一个每月查找值的尝试。 Spilterators是一种最佳的替代实现,还是有其他方法可以提高效率使用Java8流API查找嵌套类的多个属性的平均值,java,java-8,java-stream,Java,Java 8,Java Stream,我想用这个公式计算一年内每周的平均心率。Java8StreamsAPI已经投入使用,但我无法找到最好的方法。我当前的实现并不是那么有效,因为它是一个每月查找值的尝试。 Spilterators是一种最佳的替代实现,还是有其他方法可以提高效率 public class HeartRateService { @Autowired private FitbitRepository fitbitRepository; public List<HeartRate> getHeartRate
public class HeartRateService {
@Autowired
private FitbitRepository fitbitRepository;
public List<HeartRate> getHeartRateDetails() {
List<HeartRate> heartRateResponse = new ArrayList<>();
Map<Object, IntSummaryStatistics> results = fitbitRepository.getHeartRate().getActivitiesHeart().stream()
.filter(hr-> hr.getValue().getRestingHeartRate() != 0)
.collect(Collectors.groupingBy(HeartRateActivity::getMonth, Collectors.summarizingInt(hr -> hr.getValue().getRestingHeartRate())));
results.forEach((month,summary) -> {
HeartRate hr= new HeartRate();
hr.setMonth(month.toString());
hr.setRestingHeartRate((int) summary.getAverage());
heartRateResponse.add(hr);
});
return heartRateResponse;
}}
公共类服务{
@自动连线
私人FitbitRepository FitbitRepository;
公共列表getHeartRateDetails(){
List heartRateResponse=新建ArrayList();
映射结果=fitbitRepository.getHeartRate().getActivitiesHeart().stream()
.filter(hr->hr.getValue().getRestingHeartate()!=0)
.collect(Collectors.groupingBy(HeartRateActivity::getMonth,Collectors.SummaringIT(hr->hr.getValue().getRestingHeartate()));
结果。forEach((月,总结)->{
心率hr=新心率();
hr.setMonth(month.toString());
hr.setRestingHeartate((int)summary.getAverage());
心率反应。添加(hr);
});
回报率;
}}
心率API的类结构(POJO)-
public class HeartRate {
@JsonProperty("activities-heart")
private List<HeartRateActivity> activitiesHeart;
public List<HeartRateActivity> getActivitiesHeart() {
return activitiesHeart;
}
public void setActivitiesHeart(List<HeartRateActivity> activitiesHeart) {
this.activitiesHeart = activitiesHeart;
}}
public class HeartRateActivity {
private String dateTime;
private HeartRateValue value;
public String getMonth() {
return dateTime.substring(0, 7);
}}
public class HeartRateValue {
private List<HeartRateZone> customHeartRateZones;
private List<HeartRateZone> heartRateZones;
private int restingHeartRate = 0;
}
公共级心率{
@JsonProperty(“活动心脏”)
私人列表活动;
公共列表getActivitiesHeart(){
回归心;
}
public void setActivitiesHeart(列出activitiesHeart){
this.activitiesHeart=activitiesHeart;
}}
公开课活动{
私有字符串日期时间;
私人心率值;
公共字符串getMonth(){
returndatetime.substring(0,7);
}}
公共阶级的价值观{
私人区域清单;
私人区域;
private int restinghearate=0;
}
- setter和getter可用于所有属性
谢谢您可以通过以下方式改进代码:
public List<HeartRate> getHeartRateDetails(HeartRate heartRate) {
Map<String, IntSummaryStatistics> results = heartRate.getActivitiesHeart().stream()
.filter(hr -> hr.getValue().getRestingHeartRate() != 0)
.collect(Collectors.groupingBy(HeartRateActivity::getMonth,
Collectors.summarizingInt(hr -> hr.getValue().getRestingHeartRate())));
return results.entrySet()
.stream()
.map(e -> computeHeartRatePerMonthStatistics(e.getKey(),e.getValue()))
.collect(Collectors.toList());
}
HeartRate computeHeartRatePerMonthStatistics(String month, IntSummaryStatistics statistics) {
return new HeartRate();// convert to HeartRate given your inputs to method of conversion
}
public List getHeartRate详细信息(心率心率){
映射结果=心率。getActivitiesHeart().stream()
.filter(hr->hr.getValue().getRestingHeartate()!=0)
.collect(收集器).groupingBy(HeartRateActivity::getMonth,
Collectors.summaringit(hr->hr.getValue().getRestingHeartate());
返回结果。entrySet()
.stream()
.map(e->computeHeartRatePerMonthStatistics(e.getKey(),e.getValue()))
.collect(Collectors.toList());
}
心率计算心率月统计(字符串月、整数汇总统计){
return new HeartRate();//根据您输入的转换方法转换为心率
}
心率具体设定者setMonth
setRestingHeartRate
等在哪里?