Java 用lambda优化流

Java 用lambda优化流,java,collections,java-stream,Java,Collections,Java Stream,进一步优化以下代码的最佳方法是什么 public List<GroupDTOv2> getAllGroups(String xTenantId, CourseType courseType, String courseId, ContextType contextType, String contextId) throws AuthenticationException { final List<GroupV2> groups = groupV2Reposit

进一步优化以下代码的最佳方法是什么

 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;
}
public List getAllGroups(String xTenantId、CourseType CourseType、String courseId、ContextType ContextType、String contextId)引发AuthenticationException{
最终列表组=groupV2Repository.findBytenantidCourseTypeandCourseTypeandContextTypeandContextId(xTenantId,courseType,courseId,contextType,contextId);
最终RosterDTOv2花名册=rosterServiceFacade.get花名册(xTenantId、courseType、courseId、contextType、contextId);
final ArrayList groupDtoList=新的ArrayList();
groups.stream().forEach(组->{
final GroupDTOv2 groupDTO=新的GroupDTOv2();
copyProperties(组,groupDTO);
花名册.getUsers().forEach(userDTOv2->{
if(userDTOv2.getUserId().equalsIgnoreCase(group.getTeamLeadId())){
groupDTO.settamlead(userDTOv2);
}
if(group.getTeamMemberIds().contains(userDTOv2.getUserId())){
groupDTO.getTeamMembers().add(userDTOv2);
}
});
groupDtoList.add(groupDTO);
});
返回组策略;
}

如果我们两次使用stream来设置团队领导对象和团队成员,我认为成本会很高,在这种情况下,找到匹配的领导和团队成员最合适的方法是什么。考虑将这些设置为<代码> map <代码>,将用户ID映射到实际用户:

Map<String, UserDTOv2> userMap = roster.getUsers().stream()
        .collect(Collectors.toMap(user -> user.getUserId().toLowerCase(), 
                                  user -> user));
但是,请注意,行为与代码中的行为并不完全相同。这假设(a)没有两个用户具有相同的ID,并且(b)名册将实际包含一个与该组组长及其每个成员匹配的用户。您的将允许重复ID或没有匹配的用户,如果找不到匹配的用户,则只选择最后一个匹配的领导或忽略成员


1) 不是真正的二次型,而是O(n*m),其中n是组的数量,m是用户的数量。

在查找匹配的领导者和成员时,您似乎具有二次型复杂性。考虑将它们分组在一个映射中。它的复制粘贴我知道,但是<代码>组。流()/代码>可以简化为<代码>组。我会就此写几句话。
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());