我在Java中遇到了一个问题,这让我困扰了一整天。如果有人能帮助我,我会更高兴。
我有两个类Rate和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),
);
现在我想计算每个项目的平均评分,并将其放入List例如。
//(itemId, avgRating)
List<AvgRate> avgRates = {
(1, 2,5),
(2, 3),
(3, 2)
}
所以问题是如何使用Java流来执行此操作。
感谢您的任何建议。
答案 0 :(得分: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());
第一个块会将您的列表转换为Map
itemId
s和rate
的平均值。第二个块将Map
转换回List
。