我想从这个列表中获取值:
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}
映射<字符串,字符串>newMap,应为Map<字符串,长>,但我不知道如何处理那些";数字";以及";类别名称"。对象类别模型也有方法";getCategoryName"返回String。有人能帮我如何迭代列表中的值吗?
一种方法是使用这样的东西:
代替
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())
);
}
}
很抱歉格式化,我不知道如何修复代码块中的间距。
该解决方案的工作原理是,只需创建对valueOf((方法的调用结果的子字符串,并剪切标签(包括第一个=符号在内的所有内容(。
也许有更优雅的方法可以做到这一点,但我不确定如何做到。
您需要压平列表中每个映射的条目。
然后将与每个不同的CategoryModel
相关联的数据分组,并将映射到同一密钥的值相加。
基本上,这可以使用两个嵌套循环来完成(您的尝试很接近(。
这是如何使用Java 8方法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);
}
}
或者,也可以使用Stream API来完成。
groupingBy+summingLong
您可以通过列表生成流。使用flatMap()
操作展平每个Map
的条目,然后应用collect()
。
收集器groupingBy()
将对具有相同类别的条目进行分组,并且下游收集器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)
));
toMap
类似地,您可以使用收集器toMap()
:的三个参数版本
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
));