2017-11-18 89 views
4

我有一个名为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中查询? 任何帮助表示赞赏!

的得分类有:

private Long id; 
    private Double score; 

回答

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)); 
+0

谢谢你的sooo多!这会返回结果。但如果我可能会问,例如 ,如果我有6个客户,其中只有3个有超过2个结果。 Collectors.averagingDouble,是否计算所有scoresDiff除以6Clients的平均值? – MonnIca

+0

@MonnIca是的,这包括少于2个结果的客户端。如果您想忽略它们,请使用'filter'运算符。我用另一个被忽略的例子更新了答案。 – ESala

+0

这是完美的!谢谢soo sooo多!! – MonnIca