2016-04-02 23 views
0

Javaのストリームで問題が発生しています。これは一日中気になります。誰かが私を助けることができるなら、私はもっと喜んでいます。評価の一覧をjavaのストリームを使用した平均評価のリスト

私は2つのクラスレートとAvgRateあります。だから私は、料金のリストを持っているとしましょう

class Rate { 
    private int itemId; 
    private int userId; 
    private int rate; 

    [...] 
} 

class AvgRate { 
    private int itemId; 
    private int avgRate; 

    [...] 
} 

を:

//Rate(itemId, userId, rate) 
List<Rate> rates = Arrays.asList(
    new Rate(1, 1, 3), 
    new Rate(1, 2, 1), 
    new Rate(1, 3, 4), 
    new Rate(1, 4, 2), 
    new Rate(2, 1, 5), 
    new Rate(2, 2, 1), 
    new Rate(3, 3, 2), 
); 

は、今私は、各項目の平均レーティングを計算しに入れたいですリスト例

//(itemId, avgRating) 
List<AvgRate> avgRates = { 
    (1, 2,5), 
    (2, 3), 
    (3, 2) 
} 

Javaストリームを使用してこの操作を行うにはどうすればよいですか。

ありがとうございました。

+0

'Collectors.groupingBy(Rate :: getItemId)'と 'Collectors.mapping(Rate :: getRate) 'と下流の' Collectors.averagingInt'を組み合わせて使用​​します。 –

+2

あなたの試みはどこですか? – Andrew

答えて

3

はこのような何か試してみてください:

Map<Integer, Integer> avgInteger = rates.stream() 
    .collect(Collectors.groupingBy(Rate::getItemId, Collectors.averagingInt(Rate::getRate)); 

List<AvgRate> avgRates = avgInteger.entrySet().stream() 
    .map(entry -> new AvgRate(entry.getKey(), entry.getValue())) 
    .collect(Collectors.toList()); 

を最初のブロックはMapitemIdのsおよびrate秒の平均にあなたのリストを変換します。 2番目のブロックは、MapListに変換します。

関連する問題