如何遍历映射<对象列表,长>



我想从这个列表中获取值:

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
));

最新更新