Оптимизация потока с помощью лямбды - PullRequest
0 голосов
/ 08 января 2019

Что было бы лучшим способом дальнейшей оптимизации кода ниже

 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;
}

Если мы дважды используем stream для установки объекта, возглавляющего команду, и членов команды, я думаю, что стоимость будет высокой, В таком случае, что будет наиболее подходящим способом

1 Ответ

0 голосов
/ 08 января 2019

Кажется, у вас квадратичная сложность 1) для поиска подходящих лидеров и членов команды. Попробуйте добавить их в Map, сопоставляя идентификаторы пользователей с реальными пользователями:

Map<String, UserDTOv2> userMap = roster.getUsers().stream()
        .collect(Collectors.toMap(user -> user.getUserId().toLowerCase(), 
                                  user -> user));

Тогда вам не нужны внутренние циклы, и вы можете просто посмотреть на лидера и участников. Кроме того, вместо forEach, а затем 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());

Обратите внимание, однако, что поведение не совсем такое, как в вашем коде. Это предполагает, что (а) нет двух пользователей с одинаковым идентификатором, и (б) что реестр будет фактически содержать соответствующего пользователя для лидера группы и каждого из ее членов. Ваш позволит учесть дубликаты идентификаторов или не найдет подходящих пользователей и просто выберет последнего подходящего лидера или пропустит участников, если не будет найдено подходящего пользователя.

1) Не совсем квадратично, но O (n * m), где n - количество групп, а m - количество пользователей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...