Кажется, у вас квадратичная сложность 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 - количество пользователей.