List<Map<String, Object>>如何sum其中一个值
时间: 2023-12-17 20:26:54 浏览: 34
可以使用Java 8的Stream API来对List<Map<String, Object>>进行操作,具体步骤如下:
1.使用stream()方法将List转换为Stream。
2.使用map()方法将每个Map中需要求和的值取出来,转换为Double类型。
3.使用reduce()方法对所有Double类型的值进行求和。
4.使用orElse()方法设置默认值,以防止List为空。
下面是一个示例代码:
```java
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> map1 = new HashMap<>();
map1.put("id", 1);
map1.put("name", "张三");
map1.put("score", 80);
Map<String, Object> map2 = new HashMap<>();
map2.put("id", 2);
map2.put("name", "李四");
map2.put("score", 90);
list.add(map1);
list.add(map2);
double sum = list.stream()
.map(map -> (Double) map.get("score"))
.reduce(Double::sum)
.orElse(0.0);
System.out.println("总分数为:" + sum);
```
相关问题
List<Map<String, Object>> mapList怎么用流groupby
假设我们有一个 `List<Map<String, Object>>` 类型的变量 `dataList`,其中每个 Map 表示一个数据行,包含了多个字段。我们想要对这些数据按照某个字段进行分组,并计算每组的数量和总和。可以使用 Java 8 中的流和 `Collectors.groupingBy` 方法来实现。
具体的代码如下:
```java
// 按照字段 "groupField" 进行分组,并计算每组的数量和 "sumField" 字段的总和
Map<Object, Map<String, Object>> groupResult = dataList.stream()
.collect(Collectors.groupingBy(
map -> map.get("groupField"),
Collectors.collectingAndThen(
Collectors.toList(),
list -> {
int count = list.size();
double sum = list.stream().mapToDouble(map -> (double) map.get("sumField")).sum();
Map<String, Object> result = new HashMap<>();
result.put("count", count);
result.put("sum", sum);
return result;
}
)
));
```
上述代码中,`groupingBy` 方法的第一个参数传入一个函数,用来指定按照哪个字段进行分组,它返回的值就是分组的依据。第二个参数传入一个收集器,用来收集每个组内的元素,并对它们进行计算。在本例中,我们使用 `Collectors.collectingAndThen` 方法来指定一个中间收集器,它首先将同一组的元素收集到一个列表中,然后对这个列表进行计算,计算出数量和总和,最后将结果封装到一个 `Map` 中返回。整个流式处理的结果是一个 `Map<Object, Map<String, Object>>` 类型的变量 `groupResult`,其中第一层的键是分组的值,第二层的键是 "count" 和 "sum",分别对应数量和总和。
List<Map<String,Object>>一旦map中一个字段为是则返回0 否则返回 另一个字段的和
好的,可以按照以下步骤实现:
1. 初始化变量 "has_flag" 为 false,变量 "sum" 为 0。
2. 遍历列表中的每一个 map,对于每一个 map,进行以下操作:
a. 如果该 map 中标识字段为是,则将变量 "has_flag" 设置为 true,并结束遍历。
b. 否则,将该 map 中的积分字段累加到变量 "sum" 中。
3. 如果变量 "has_flag" 为 true,则将变量 "sum" 设置为 0。
4. 返回变量 "sum"。
具体实现代码如下:
```java
List<Map<String, Object>> list = ... // 列表数据
int sum = 0;
boolean hasFlag = false;
for (Map<String, Object> map : list) {
Object flag = map.get("flag");
if (flag != null && flag.toString().equals("是")) {
hasFlag = true;
break;
} else {
Object score = map.get("score");
if (score != null) {
sum += Integer.parseInt(score.toString());
}
}
}
if (hasFlag) {
sum = 0;
}
return sum;
```
上述代码中,假设列表中的每一个 map 都包含了 "flag" 和 "score" 两个字段,其中 "flag" 用于判断是否有标识,"score" 用于获取积分字段的值。在遍历列表的过程中,如果发现有标识字段为是,则将变量 "hasFlag" 设置为 true,并结束遍历。否则,将该 map 中的积分字段累加到变量 "sum" 中。最后,如果变量 "hasFlag" 为 true,则将变量 "sum" 设置为 0,最终返回变量 "sum"。