使用java流将评级列表转换为平均评级列表

时间:2016-04-02 17:37:51

标签: java lambda java-stream

我在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流来执行此操作。

感谢您的任何建议。

1 个答案:

答案 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