我想从这个列表中获取值:
List<Map<CategoryModel,Long>> list = categoryRespository.findSalesByCategory();
我从列表中打印值,如下所示:
for (Map<CategoryModel, Long> categoryModelLongMap : list) {
System.out.println(categoryModelLongMap.values());
}
输出:
[computers, 0]
[mouses, 0]
[keyboards, 0]
[laptops, 0]
但是现在我想将这些值添加到另一个映射中,就像它们出现在上面一样。我写了一些类似的东西,但是它不起作用
Map<String, String> newMap = new HashMap<>();
for (Map<CategoryModel, Long> featureService : list) {
for (Map.Entry<CategoryModel,Long> entry : featureService.entrySet()) {
newMap.put(String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
}
}
输出:
{number=0, category_name=laptops}
地图
一种方法是使用这样的东西:
而不是
Map<String, String> newMap = new HashMap<>();
for (Map<CategoryModel, Long> featureService : list) {
for (Map.Entry<CategoryModel,Long> entry : featureService.entrySet()) {
newMap.put(String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
}
}
使用
Map<String, String> newMap = new HashMap<>();
for (Map<CategoryModel, Long> featureService : list) {
for (Map.Entry<CategoryModel,Long> entry : featureService.entrySet()) {
String rawKeyReturn = String.valueOf(entry.getKey());
String rawValueReturn = String.valueOf(entry.getValue());
newMap.put(
rawKeyReturn.substring(rawKeyReturn.indexOf("=")+1,rawKeyReturn.length()),
rawValueReturn.substring(rawValueReturn.indexOf("=")+1,rawValueReturn.length())
);
}
}
抱歉的格式,我不知道如何修复代码块中的行间距。
此解决方案的工作原理是仅创建调用value eOf()方法的结果的子字符串并切断标签(包括第一个=符号在内的所有内容)。
可能有更优雅的方法来做到这一点,但我不确定如何做到。
您需要将列表中每个地图的条目展平。
然后将与每个不同的分类模型
关联的数据分组,并将映射到同一键的值相加。
基本上,这可以使用两个嵌套循环来完成(您的尝试很接近)。
如何实现它可以使用Java8方法Map. merge()
:
List<Map<CategoryModel,Long>> list = categoryRespository.findSalesByCategory();
Map<String, Long> result = new HashMap<>();
for (Map<CategoryModel, Long> categoryModelLongMap : list) {
for (Map.Entry<CategoryModel, Long> entry : categoryModelLongMap.entrySet()) {
result.merge(entry.getKey().getCategoryName(),
entry.getValue(),
Long::sum);
}
}
或者,可以使用StreamAPI。
您可以在列表上生成流。使用plattMap()
操作展平每个Map
的条目,然后应用收集()
。
CollectorgroupingBy()
将对具有相同类别的条目进行分组,下游收集器summingLong()
将聚合与相同键关联的值。
List<Map<CategoryModel,Long>> list = categoryRespository.findSalesByCategory();
Map<String, Long> result = list.stream()
.flatMap(map -> map.entrySet().stream())
.collect(Collectors.groupingBy(
entry -> entry.getKey().getCategoryName(),
Collectors.summingLong(Map.Entry::getValue)
));
同样,您可以使用CollectortoMap()
的三参数版本:
List<Map<CategoryModel,Long>> list = categoryRespository.findSalesByCategory();
Map<String, Long> result = list.stream()
.flatMap(map -> map.entrySet().stream())
.collect(Collectors.toMap(
entry -> entry.getKey().getCategoryName(),
Map.Entry::getValue,
Long::sum
));