List<IotUser> iotUserList = iotUserMapper.getIotUserList(null, null); Map<String, Map<Integer, List<IotUser>>> collect = iotUserList.stream().collect(Collectors.groupingBy(IotUser::getUserMobile, Collectors.groupingBy(IotUser::getUserType))); List<IotUser> result = null; collect.forEach((k,v)->{ v.forEach((a,b)->{ List<String> collect1 = b.stream().map(IotUser::getOrgUid).collect(Collectors.toList()); String collect2 = collect1.stream().collect(Collectors.joining(",")); IotUser iotUser = b.get(0); result.add(iotUser); }); });这段代码的解释及如何优化
时间: 2023-03-27 07:01:41 浏览: 75
这段代码是对一个 List<IotUser> 进行分组,按照用户手机号和用户类型进行分组,然后将每组中的机构 ID 拼接成一个字符串,最后将每组中的第一个元素添加到结果列表中。
为了优化这段代码,可以考虑使用并行流来提高效率,同时可以使用 ConcurrentHashMap 来替代普通的 HashMap,以提高并发性能。另外,在对每组进行操作时,可以使用 reduce 方法来避免创建中间集合,从而减少内存开销。
相关问题
优化代码:public List<ProjectCountVO> projectCount(String beginTime, String endTime, Integer forceType, String projectId) { ResultWrapper<QueryAllProjectName> resultWrapper = (ResultWrapper<QueryAllProjectName>) applicationServicePlatformClient.queryProjectName(projectId); if (resultWrapper.getData() == null) { return Collections.emptyList(); } String projectName = resultWrapper.getData().getProjectName(); 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); 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. 使用 Optional 类简化代码。可以使用 `Optional.ofNullable()` 来避免空指针异常,使用 `orElse()` 来指定默认值。
2. 使用 Stream API 来简化代码。可以使用 `Collectors.groupingBy()` 来对列表进行分组,使用 `Collectors.summingInt()` 来统计数量。
3. 减少方法调用次数。可以将 `resultWrapper.getData()` 的结果保存在变量中,避免多次调用。
4. 将变量名命名得更具有表现力。可以将 `taskTaskList` 改为 `tasks`,将 `projectTaskMap` 改为 `projectTasks`。
优化后的代码如下:
```
public List<ProjectCountVO> projectCount(String beginTime, String endTime, Integer forceType, String projectId) {
ResultWrapper<QueryAllProjectName> resultWrapper = (ResultWrapper<QueryAllProjectName>) applicationServicePlatformClient.queryProjectName(projectId);
QueryAllProjectName projectNameData = resultWrapper.getData();
if (projectNameData == null) {
return Collections.emptyList();
}
String projectName = projectNameData.getProjectName();
List<TaskTask> tasks = this.listStatisticsTask(beginTime, endTime, forceType, projectId);
if (CollectionUtil.isEmpty(tasks)) {
return Collections.emptyList();
}
Map<String, List<TaskTask>> projectTasks = tasks.stream().collect(Collectors.groupingBy(TaskTask::getProjectId));
List<ProjectCountVO> result = new ArrayList<>();
for (Map.Entry<String, List<TaskTask>> projectTaskEntry : projectTasks.entrySet()) {
String projectTaskId = projectTaskEntry.getKey();
ProjectCountVO projectCountVO = new ProjectCountVO();
projectCountVO.setId(projectTaskId);
projectCountVO.setName(projectName);
List<TaskTask> taskList = projectTaskEntry.getValue();
projectCountVO.setTaskCount(taskList.size());
Integer problemCount = taskList.stream()
.map(TaskTask::getProblemNum)
.filter(Objects::nonNull)
.mapToInt(Integer::intValue)
.sum();
projectCountVO.setProblemCount(problemCount);
result.add(projectCountVO);
}
return result;
}
```
优化这段java代码 //通过域账号名称 调用userSdk获取 对应ID List<String> sendUserNameList = form.getOperationScoreDTOList() .stream().map(OperationScoreDTO::getSenderName).distinct().collect(Collectors.toList()); List<String> receiverUserNameList = form.getOperationScoreDTOList() .stream().map(OperationScoreDTO::getReceiverName).distinct().collect(Collectors.toList()); List<FindOneByUsernameVo> sendUserList = userServiceSdk.findByUsernames(sendUserNameList); List<FindOneByUsernameVo> receiverUserList = userServiceSdk.findByUsernames(receiverUserNameList); Map<String, Integer> senderMap = sendUserList .stream() .collect(Collectors.toMap(FindOneByUsernameVo::getUsername, FindOneByUsernameVo::getTeclibUserId)); Map<String, Integer> receiverMap = receiverUserList .stream() .collect(Collectors.toMap(FindOneByUsernameVo::getUsername, FindOneByUsernameVo::getTeclibUserId)); for (OperationScoreDTO operationScoreDTO : form.getOperationScoreDTOList()) { Integer senderId = senderMap.get(operationScoreDTO.getSenderName()); if (senderId == null) { throw new BizException("获取发送者失败"); } Integer receiverId = receiverMap.get(operationScoreDTO.getSenderName()); if (receiverId == null) { throw new BizException("获取接收者失败"); } Short score = operationScoreDTO.getScore(); String remark = operationScoreDTO.getRemark(); OperationScoreEntity os = new OperationScoreEntity(); os.setSendId(senderId); os.setReceiverId(receiverId); os.setEvent(score.toString()); os.setRemark(remark); os.setSendTime(LocalDate.now()); operationScoreRepository.save(os); String event = ScoreEventConstant.BONUS_SCORE; String module = ScoreModuleConstant.BONUS_SCORE; String payload = String.format("osId:%d;receiver:%d;remark:%s;score:%s", os.getId(), receiverId, remark, score); UserScoreEntity userScore = new UserScoreEntity(); userScore.setUserId(receiverId); userScore.setModule(module); userScore.setEvent(event); userScore.setPayload(payload); userScore.setOperationTime(operationScoreDTO.getOperationTime()); userScore.setScore(score); Integer totalScore = this.findTotalScoreByUserId(receiverId); userScore.setTotal(Math.max(totalScore + score, 0)); userScoreRepository.save(userScore); } return Boolean.TRUE;
在这段代码中,你可以考虑以下优化措施:
1. 将重复的代码提取为方法:将获取用户名列表和调用 `userServiceSdk.findByUsernames` 的逻辑提取为一个方法,这样可以减少重复代码。
2. 使用 `forEach` 替代 `for` 循环:使用流的 `forEach` 方法可以简化循环的书写,更加简洁和直观。
3. 使用批量插入:使用批量插入操作可以减少数据库交互次数,提高性能。
下面是优化后的代码示例:
```java
List<String> sendUserNameList = form.getOperationScoreDTOList()
.stream().map(OperationScoreDTO::getSenderName).distinct().collect(Collectors.toList());
List<String> receiverUserNameList = form.getOperationScoreDTOList()
.stream().map(OperationScoreDTO::getReceiverName).distinct().collect(Collectors.toList());
Map<String, Integer> senderMap = getUserIdsByUsernames(sendUserNameList);
Map<String, Integer> receiverMap = getUserIdsByUsernames(receiverUserNameList);
form.getOperationScoreDTOList().forEach(operationScoreDTO -> {
Integer senderId = senderMap.get(operationScoreDTO.getSenderName());
if (senderId == null) {
throw new BizException("获取发送者失败");
}
Integer receiverId = receiverMap.get(operationScoreDTO.getSenderName());
if (receiverId == null) {
throw new BizException("获取接收者失败");
}
Short score = operationScoreDTO.getScore();
String remark = operationScoreDTO.getRemark();
OperationScoreEntity os = new OperationScoreEntity();
os.setSendId(senderId);
os.setReceiverId(receiverId);
os.setEvent(score.toString());
os.setRemark(remark);
os.setSendTime(LocalDate.now());
operationScoreRepository.save(os);
String event = ScoreEventConstant.BONUS_SCORE;
String module = ScoreModuleConstant.BONUS_SCORE;
String payload = String.format("osId:%d;receiver:%d;remark:%s;score:%s",
os.getId(), receiverId, remark, score);
UserScoreEntity userScore = new UserScoreEntity();
userScore.setUserId(receiverId);
userScore.setModule(module);
userScore.setEvent(event);
userScore.setPayload(payload);
userScore.setOperationTime(operationScoreDTO.getOperationTime());
userScore.setScore(score);
Integer totalScore = this.findTotalScoreByUserId(receiverId);
userScore.setTotal(Math.max(totalScore + score, 0));
userScoreRepository.save(userScore);
});
return Boolean.TRUE;
private Map<String, Integer> getUserIdsByUsernames(List<String> usernames) {
List<FindOneByUsernameVo> userList = userServiceSdk.findByUsernames(usernames);
return userList.stream()
.collect(Collectors.toMap(FindOneByUsernameVo::getUsername, FindOneByUsernameVo::getTeclibUserId));
}
```
通过上述优化,你可以减少代码重复,提高代码的可读性和维护性,并且减少数据库交互次数,提高性能。