使用java streams将评级列表转换为平均评级列表
我对Java中的流有一个问题,这困扰了我一整天。所以如果有人能帮助我,我会非常高兴 我有两门课,分别是Rate和AvgRate:使用java streams将评级列表转换为平均评级列表,java,lambda,java-stream,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; [...] } 假设我有一份费率清
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、userId、Rate)
列表速率=Arrays.asList(
新利率(1,1,3),
新利率(1,2,1),
新利率(1,3,4),
新利率(1,4,2),
新利率(2,1,5),
新利率(2,2,1),
新利率(3,3,2),
);
现在我想计算每个项目的平均评分,并将其放入列表中
//(itemId, avgRating)
List<AvgRate> avgRates = {
(1, 2,5),
(2, 3),
(3, 2)
}
//(itemId,avg)
列表平均梯度={
(1, 2,5),
(2, 3),
(3, 2)
}
因此,问题在于如何使用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());
Map avgInteger=rates.stream()
.collect(Collectors.groupingBy(Rate::getItemId,Collectors.Averaging(Rate::getRate));
List avgRates=avgInteger.entrySet().stream()
.map(entry->new AvgRate(entry.getKey(),entry.getValue())
.collect(Collectors.toList());
第一个块将您的列表转换为
itemId
s的Map
和速率的平均值。第二个块将Map
转换回列表
尝试以下操作:
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 avgInteger=rates.stream()
.collect(Collectors.groupingBy(Rate::getItemId,Collectors.Averaging(Rate::getRate));
List avgRates=avgInteger.entrySet().stream()
.map(entry->new AvgRate(entry.getKey(),entry.getValue())
.collect(Collectors.toList());
第一个块将列表转换为itemId
s的Map
和rate
s的平均值。第二个块将Map
转换回列表
使用收集器。分组方式(rate::getItemId)
与收集器组合。映射(rate::getRate)
和a收集器。下游的Averaging
尝试在哪里?使用收集器。groupingBy(Rate::getItemId)
与a收集器相结合。映射(Rate::getRate)
和a收集器。下游的Averaging
尝试在哪里?