Collectors.summingInt 为null 时候取0
时间: 2024-10-09 08:06:50 浏览: 26
`Collectors.summingInt` 是 Java Stream API 中的一个收集器,用于对整数类型的元素进行求和操作。当你尝试使用这个方法处理一个空集合(null 或者长度为 0 的集合),它默认会返回 `Integer` 类型的零值,也就是 0。
例如:
```java
List<Integer> numbers = null;
OptionalLong sum = numbers.stream()
.collect(Collectors.summingInt(Integer::intValue));
if (sum.isPresent()) {
int total = sum.getAsInt(); // 如果numbers为空,total将为0
} else {
System.out.println("Numbers list is empty or null");
}
```
如果 `numbers` 为 `null`,上述代码会直接打印出 "Numbers list is empty or null",而不会抛出异常,因为 `sum` 是一个 `OptionalLong`,它的 `isPresent()` 方法可以检查是否存在非空结果。
相关问题
public Map<String, Integer> formReportPosition(String formKey) { List<FormReportVO.Position> reportPositions = formDashboardMapper.selectFormReportPosition(formKey); return reportPositions.stream() .filter(item -> ObjectUtil.isNotNull(CollectionUtil.get(StrUtil.split(item.getSubmitAddress(), CharUtil.DASHED), 0))) .map(item -> { item.setSubmitProvince(CollectionUtil.get(StrUtil.split(item.getSubmitAddress(), CharUtil.DASHED), 0)); return item; }).collect(Collectors.groupingBy(FormReportVO.Position::getSubmitProvince, Collectors.summingInt(FormReportVO.Position::getCount))); }
这段代码实现了一个表单数据报表的功能,返回一个包含各个省份提交表单数量的 Map。具体实现如下:
1. 首先通过 `formDashboardMapper.selectFormReportPosition(formKey)` 方法获取表单报表数据,得到一个 `List<FormReportVO.Position>` 类型的对象 `reportPositions`。
2. 对 `reportPositions` 进行流式处理,使用 `filter()` 方法过滤掉 `submitAddress` 为空的数据。
3. 使用 `map()` 方法处理每个元素,将 `submitAddress` 字段按照 `-` 分割后取第一个元素作为省份,并将其设置到 `submitProvince` 字段中。
4. 最后使用 `collect()` 方法将处理后的数据按照省份分组,并将每个省份对应的表单数量相加,得到一个 Map 类型的结果。
其中,`Collectors.groupingBy()` 方法用于按照指定字段分组,`Collectors.summingInt()` 方法用于对每个组的指定字段进行求和。
下面代码为何无法获取“projectname”:Map<String, String> projectMap = queryAllProject.stream().collect(Collectors.toMap(QueryAllProject::getId, QueryAllProject::getName)); // 遍历项目及对应的任务列表 for (Map.Entry<String, List<TaskTask>> projectTaskEntry : projectTaskMap.entrySet()) { projectId = projectTaskEntry.getKey(); ProjectCountVO projectCountVO = new ProjectCountVO(); projectCountVO.setId(projectId); // 根据projectId获取项目名称 String projectName = projectMap.get(projectId); projectCountVO.setName(projectName); //projectCondition.setProjectName(projectName); List<TaskTask> taskList = projectTaskEntry.getValue(); projectCountVO.setTaskCount(taskList.size()); Integer problemCount = CollectionUtil.isEmpty(taskList) ? 0 : taskList.stream().collect(Collectors.summingInt(task -> Optional.ofNullable(task.getProblemNum()).orElse(0))); projectCountVO.setProblemCount(problemCount); result.add(projectCountVO); } return result;
可能是因为 `queryAllProject` 中没有包含 `projectid` 对应的值,导致在 `projectMap` 中无法找到对应的项目名称。你可以添加一个空值判断,如下所示:
```
String projectName = projectMap.get(projectId);
if (projectName == null) {
projectName = "";
}
projectCountVO.setName(projectName);
```
这样就能够避免 `NullPointerException` 的出现,并将未找到项目名称的情况视为一个空字符串。
阅读全文