Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java streams将评级列表转换为平均评级列表_Java_Lambda_Java Stream - Fatal编程技术网

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

使用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; [...] } 假设我有一份费率清

我对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、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
尝试在哪里?