Дублировать значения в карту - PullRequest
0 голосов
/ 25 августа 2018

У меня проблемы с этим фрагментом кода.

Я создаю карту со списком демографии, но в какой-то момент у меня есть дубликаты элементов списка.Вы видите, где я совершаю ошибку?

С уважением.

public Map<DemoType, List<Demography>> demoTypeToDemosList(final Long campaignId, final MediaType mediaType) {
        List<MappedDemoDTO> mappedDemosList = demoTypeCampaignService.getMappedDemosByMediaTypeAndCampaignIdOrderByOrdinalRankAsc(mediaType, campaignId);

        final Set<Long> demoIds = mappedDemosList.stream().map(MappedDemoDTO::getMappedId).collect(Collectors.toSet());
        DemographyProviderService serviceByProviderAndMediaType = demographyFactory.getServiceByProviderAndMediaType(Provider.PROVIDER, mediaType);
        final List<Demo> demos = serviceByProviderAndMediaType.getDemoByExternalIds(demoIds);

        Map<DemoType, List<Demography>> demoTypeToDemosMap = new EnumMap<>(DemoType.class);

        mappedDemosList.forEach(mappedDemo -> demos.stream()
            .filter(demo -> mappedDemo.getMappedId().equals(demo.getId()))
            .findFirst()
            .ifPresent(demo -> {
                List<Demography> demosList = demoTypeToDemosMap.computeIfAbsent(mappedDemo.getDemoType(), f -> new ArrayList<>());
                demo.setId(mappedDemo.getDemoId());
                demosList.add(demo);
            }));

        return demoTypeToDemosMap;
    }

1 Ответ

0 голосов
/ 25 августа 2018

Прочтите документацию computeIfAbsent:

возвращает текущее ( существующее или вычисленное) значение, связанное с указанным ключом, или ноль, если вычисленное значение равно нулю

Это:

List<Demography> demosList = demoTypeToDemosMap.computeIfAbsent(mappedDemo.getDemoType(), f -> new ArrayList<>());

вернет новый ArrayList, если ключ отсутствует в Map или существующем , который вы позже просто добавите к нему: demosList.add(demo);

...