下面代码为何无法获取“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;
时间: 2024-01-01 09:03:37 浏览: 68
可能是因为 `queryAllProject` 中没有包含 `projectid` 对应的值,导致在 `projectMap` 中无法找到对应的项目名称。你可以添加一个空值判断,如下所示:
```
String projectName = projectMap.get(projectId);
if (projectName == null) {
projectName = "";
}
projectCountVO.setName(projectName);
```
这样就能够避免 `NullPointerException` 的出现,并将未找到项目名称的情况视为一个空字符串。
相关问题
根据代码1“@FeignClient(name = "UserUgsApi", url = "${newbim.login-domain}") public interface IApplicationServicePlatformClient {@PostMapping("/ums/v1/feign/omp/project/search") ResultWrapper<QueryAllProject> listUserProject(@RequestHeader("BSP_TOKEN") String bspToken, @RequestHeader("BSP_USER_ID") String bspUserId, @RequestHeader("BSP_USER_ENV_ID") String bspUserEnvId, @RequestHeader("BSP_USER_TENANT") String bspUserTenant, @RequestBody ProjectCondition queryProjectDto);” ,修改并优化下面代码:public List<ProjectCountVO> projectCount(String beginTime, String endTime, Integer forceType, String projectId) { List<TaskTask> taskTaskList = this.listStatisticsTask(beginTime, endTime, forceType, projectId); if(CollectionUtil.isEmpty(taskTaskList)){ return Collections.emptyList(); } List<ProjectCountVO> result = new ArrayList<>(); Map<String, List<TaskTask>> projectTaskMap = taskTaskList.stream().collect(Collectors.groupingBy(TaskTask::getProjectId)); for (Map.Entry<String, List<TaskTask>> projectTaskEntry : projectTaskMap.entrySet()) { projectId = projectTaskEntry.getKey(); ProjectCountVO projectCountVO = new ProjectCountVO(); projectCountVO.setId(projectId); //查询项目名称String projectName = Optional.ofNullable(projectTaskMap.get(projectId)).map(taskList -> taskList.get(0).getName()).orElse(""); projectCountVO.setName(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; }
根据代码1,可以看出这段代码是通过 FeignClient 调用远程服务接口来获取项目信息,然后按照项目维度进行统计。为了优化代码,可以考虑以下几个方面:
1. 使用缓存:如果该方法被频繁调用,可以将接口返回的数据进行缓存,避免重复访问远程服务。
2. 减少接口调用次数:可以考虑将 FeignClient 接口的返回值进行缓存,然后在方法内部对缓存进行处理,避免重复调用 FeignClient 接口。
3. 使用并发流操作:可以使用 Java 8 的并发流操作来对 List 集合进行分组、过滤和统计操作,提高代码的可读性和执行效率。
修改后的代码如下:
```
public List<ProjectCountVO> projectCount(String beginTime, String endTime, Integer forceType, String projectId) {
// 查询任务信息
List<TaskTask> taskTaskList = this.listStatisticsTask(beginTime, endTime, forceType, projectId);
if(CollectionUtil.isEmpty(taskTaskList)){
return Collections.emptyList();
}
// 将任务按照项目 ID 进行分组
Map<String, List<TaskTask>> projectTaskMap = taskTaskList.stream().collect(Collectors.groupingBy(TaskTask::getProjectId));
// 查询项目名称,并统计任务和问题数量
return projectTaskMap.entrySet().parallelStream().map(projectTaskEntry -> {
projectId = projectTaskEntry.getKey();
ProjectCountVO projectCountVO = new ProjectCountVO();
projectCountVO.setId(projectId);
String projectName = Optional.ofNullable(projectTaskMap.get(projectId))
.map(taskList -> taskList.get(0).getName())
.orElse("");
projectCountVO.setName(projectName);
List<TaskTask> taskList = projectTaskEntry.getValue();
projectCountVO.setTaskCount(taskList.size());
Integer problemCount = taskList.parallelStream()
.mapToInt(task-> Optional.ofNullable(task.getProblemNum()).orElse(0))
.sum();
projectCountVO.setProblemCount(problemCount);
return projectCountVO;
}).collect(Collectors.toList());
}
```
修改后的代码中,使用了并发流操作来对任务进行分组、过滤和统计,提高了代码的可读性和执行效率。同时,将 FeignClient 接口的返回值进行缓存,避免了重复调用接口。
@Mojo(name="bootJar") public class BootJarMojo extends AbstractMojo { // 可自由获取maven内置变量 @Parameter(defaultValue = "${settings.localRepository}",required = true) private String localRepository; @Parameter(property = "main.class",required = true) private String mainClass; @Componentprotected MavenProject project; public void execute() throws MojoFailureException { getLog().info("project localRepository is " + localRepository); File baseDir = project.getBasedir(); getLog().info("project base dir is " + baseDir); String artifactId = project.getArtifactId(); String version = project.getVersion(); File targetDirectory = new File(baseDir, "target"); File classesDirectory = new File(targetDirectory, "classes"); getLog().info("project classes dir is " +classesDirectory.getAbsolutePath()); List<File> dependencyFiles = project.getDependencyArtifacts() .stream() .map(Artifact::getFile) .filter(Objects::nonNull) .collect(Collectors.toList()); ... } }
这段代码是一个名为`BootJarMojo`的Maven插件,它继承自`AbstractMojo`类并实现了`execute()`方法。这个插件的作用是用于构建Spring Boot项目的可执行jar文件。
该插件包含以下几个成员变量和注解:
- `localRepository`:通过`@Parameter`注解,注入了Maven内置变量`${settings.localRepository}`,表示本地仓库的路径。
- `mainClass`:通过`@Parameter`注解,注入了一个用户自定义的变量`main.class`,表示项目的主类名。
- `project`:通过`@Component`注解,注入了`MavenProject`对象,表示当前的Maven项目。
在`execute()`方法中,插件会执行以下操作:
- 打印出本地仓库路径和项目基础目录。
- 获取项目的ArtifactId和Version。
- 创建目标目录(`${basedir}/target`)和类文件目录(`${basedir}/target/classes`)。
- 获取项目依赖的所有jar文件的路径,并将其存储在一个列表中。
根据代码中省略的部分,您可以继续编写插件的逻辑,例如运行Spring Boot的打包命令或其他构建操作。
请注意,该代码是一个基本的示例,您可能需要根据您的具体需求进行修改和扩展。如果您有任何其他问题,请随时提问。
阅读全文