如何遍历每一行,计算差异然后平均一切?

时间:2017-11-18 12:05:00

标签: java spring spring-boot

我有一个名为Client的模型,其中包含以下信息:

private Long int;
@OneToMany(mappedBy = "client", cascade = CascadeType.ALL)        
private List<Results> results;

和模型结果有以下信息:

@ManyToOne
@JoinColumn(name='client_id') 
private Client client;
@OneToOne
private Scores score;
private Date submittedDate;

我想要实现的目标是:

对于每个用户获得他们的第一个结果的分数和他们的最后结果的分数,找到差异。 然后平均每个人的差异。 如何编写计算它的函数?

客户端返回所有结果的列表,然后返回    差异:结果[最后] - 结果[0]    然后循环:

for (int i=0; i <= client.count(); i++)
    difference = results[last] - results[0];
    sum += difference;
    average = sum/client.count();`

我很难将其转换为适用于Spring的代码。 我是在ClientServiceImplementation中编写它,然后在ClientRepository中进行查询吗? 任何帮助表示赞赏!!!

Score类有:

  private Long id;
  private Double score;

1 个答案:

答案 0 :(得分:1)

你可以这样做:

List<Client> clients = clientRepository.findAll();

Double meanDiff = clients.stream()
    .map(client -> {
        List<Result> results = client.getResults();
        if (results.size() >= 2) {
            Score first = results.get(0);
            Score last = results.get(results.size() - 1);
            return last.value - first.value;
        } else {
           return 0.0;
        }
    })
    .collect(Collectors.averagingDouble(it -> it));

注意:您没有指定Score类的内容,因此我假设它的value字段类型为Double

更新:这是另一个例子,但忽略了numberOfResults < 2的客户:

Double meanDiff = clients.stream()
    .map(client -> client.getResults())
    .filter(results -> results.size() >= 2) // <-- keep these only
    .map(results -> {
        Score first = results.get(0);
        Score last = results.get(results.size() - 1);
        return last.value - first.value;
    })
    .collect(Collectors.averagingDouble(it -> it));