【问题标题】:Stream API - how to return map of unique task name - average result?Stream API - 如何返回唯一任务名称的地图 - 平均结果?
【发布时间】:2021-12-31 09:22:18
【问题描述】:

我有一个CourseResult 课程

public class CourseResult {
    private final Person person;
    private final Map<String, Integer> taskResults; // Here names and results of tasks are saved 

    public CourseResult(final Person person, final Map<String, Integer> taskResults) {
        this.person = person;
        this.taskResults = taskResults;
    }

    public Person getPerson() {
        return person;
    }

    public Map<String, Integer> getTaskResults() {
        return taskResults;
    }
}

这是我的方法签名

public Map<String, Double> averageScoresPerTask(Stream<CourseResult> programmingResults) {

我需要返回每个任务的平均结果。

【问题讨论】:

  • 您确定接受课程结果流(0..n 人)并返回单个结果(1 人)的意图正确吗?

标签: java java-stream average


【解决方案1】:

我将flatMap 将该流发送到taskResults' 条目的流中,然后使用Collectors.averagingDouble 获得每个任务的平均值:

public Map<String, Double> averageScoresPerTask(Stream<CourseResult> programmingResults) {
    return programmingResults
            .flatMap(c -> c.getTaskResults().entrySet().stream())
            .collect(Collectors.groupingBy(
                        Map.Entry::getKey,
                        Collectors.averagingDouble(Map.Entry::getValue)));
}

【讨论】:

  • .flatMap( ... ) .map(CourseResult::getTaskResults) .map(Map::entrySet) .flatMap(Set::stream)
猜你喜欢
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 2017-07-04
  • 2012-10-31
  • 2018-11-03
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多