java - 使用 lambda 优化 Stream
问题描述
进一步优化以下代码的最佳方法是什么
public List<GroupDTOv2> getAllGroups(String xTenantId, CourseType courseType, String courseId, ContextType contextType, String contextId) throws AuthenticationException {
final List<GroupV2> groups = groupV2Repository.findByTenantIdAndCourseTypeAndCourseIdAndContextTypeAndContextId(xTenantId, courseType, courseId, contextType, contextId);
final RosterDTOv2 roster = rosterServiceFacade.getRoster(xTenantId, courseType, courseId, contextType, contextId);
final ArrayList<GroupDTOv2> groupDtoList=new ArrayList<>();
groups.stream().forEach(group -> {
final GroupDTOv2 groupDTO=new GroupDTOv2();
BeanUtils.copyProperties(group,groupDTO);
roster.getUsers().forEach(userDTOv2 -> {
if(userDTOv2.getUserId().equalsIgnoreCase(group.getTeamLeadId())){
groupDTO.setTeamLead(userDTOv2);
}
if(group.getTeamMemberIds().contains(userDTOv2.getUserId())){
groupDTO.getTeamMembers().add(userDTOv2);
}
});
groupDtoList.add(groupDTO);
});
return groupDtoList;
}
如果我们两次使用流来设置团队领导对象和团队成员,我认为成本会很高,那么什么是最合适的方式
解决方案
您似乎具有二次复杂度1)来寻找匹配的领导者和团队成员。考虑将它们放入 aMap
中,将用户 ID 映射到实际用户:
Map<String, UserDTOv2> userMap = roster.getUsers().stream()
.collect(Collectors.toMap(user -> user.getUserId().toLowerCase(),
user -> user));
然后,您不需要内部循环,只需查找领导者和成员即可。此外,您可以使用and而不是forEach
and then 。groupDtoList.add
map
collect
List<GroupDTOv2> groupDtoList = groups.stream().map(group -> {
GroupDTOv2 groupDTO = new GroupDTOv2();
BeanUtils.copyProperties(group, groupDTO);
groupDTO.setTeamLead(userMap.get(group.getTeamLeadId().toLowerCase()));
group.getTeamMemberIds().forEach(id -> {
groupDTO.getTeamMembers().add(userMap.get(id.toLowerCase()));
});
return groupDTO;
}).collect(Collectors.toList());
但是请注意,该行为与您的代码中的行为并不完全相同。这假设 (a) 没有两个用户具有相同的 ID,并且 (b) 名册实际上将包含与该组的领导者及其每个成员匹配的用户。您的将允许重复的 ID 或没有匹配的用户,如果找不到匹配的用户,则只会选择最后一个匹配的领导者或省略成员。
1)不是真正的二次方,而是 O(n*m),其中 n 是组数,m 是用户数。
推荐阅读
- android - 什么是 parcelable 以及为什么它用于 BluetoothDevice.EXTRA_DEVICE?
- python - 如何将 py 制作的 exe 文件从我的电脑更新给我发送给的人?
- reactjs - React:使用异步数据从父组件更新子组件状态
- python - 如何在 Python 中使用正则表达式获取字符串的一部分
- python - 在 pygame 中重置板给出属性错误
- c# - 写入另一个我读取数据包的程序的 TCP 流
- javascript - React & Redux - TypeError 状态不可迭代
- python - 如何制作这个 Python 模式?
- javascript - ws.write = (result.join(',') + '\n'); && TypeError: result.join is not a function ...我如何解决此类型错误
- c - C lang 根据每个字符串中的辅音数量比较一个二维字符串数组