我在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),
);


现在我想计算每个项目的平均评分,并将其放入列表,例如

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


因此,问题ins如何使用Java流执行此操作。

感谢您的任何建议。

最佳答案

尝试这样的事情:

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());


第一个块将您的列表转换为MapitemIdrate的平均值。第二个块将Map转换回List

10-08 02:07