2017-11-18 88 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