使用Java8流API查找嵌套类的多个属性的平均值

使用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

我想用这个公式计算一年内每周的平均心率。Java8StreamsAPI已经投入使用,但我无法找到最好的方法。我当前的实现并不是那么有效,因为它是一个每月查找值的尝试。 Spilterators是一种最佳的替代实现,还是有其他方法可以提高效率

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可用于所有属性
Fitbit有效载荷结构可在以下位置查看:


谢谢

您可以通过以下方式改进代码:

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
等在哪里?